【问题标题】:How do I execute a google script as 'owner' of a spreadsheet the user cannot view如何以用户无法查看的电子表格的“所有者”身份执行谷歌脚本
【发布时间】:2016-11-15 16:49:23
【问题描述】:

希望这是一个相当简单的问题!

我制作了一个 Google 脚本,可以写入单独的工作表“MasterSheet”中的单元格(这里有几个有用的问答)。这最终将被嵌入到我提供给各个用户的多个不同工作表中。

当用户对“MasterSheet”拥有编辑权限时,它可以完美运行,但我需要保持私密 - 即除了我之外的任何人都看不到。

作为背景:在每个“用户表”中,IMPORTRANGE 用于从“MasterSheet”中导入该用户可以查看的列,然后脚本允许用户向 MasterSheet 添加注释。 我可以查看 MasterSheet 以在一个统一的工作表上查看来自不同用户的所有带有 cmets 的列,但单个用户应该无法查看此内容。

写入工作表的特定脚本相当通用:

function saveCommentToMasterSheet(form){
  var company = form.company,
      contact = form.contactselect,
      comment = form.message ,
      ss = SpreadsheetApp.openById("MASTERSHEET_ID").getSheetByName('MasterSheet');
  if(company=="all"){
    var row = findCell(contact);
  } else {
      var row = findCell2(contact,company);
  }
    //^The above finds the specific row number relating to the entry the user wants to comment on.
  var cell2 = ss.getRange(row,11);
    // ^In this case '11' is the column related to this sheet's specific user, I've made separate sheets for each user that are identical except this column number
  cell2.setValue(comment);
}

我相信我可以让任何知道链接的人都可以编辑 MasterSheet,但我宁愿避免这样做,特别是因为脚本嵌入在每个电子表格中,所以如果用户只是查看它,他们就会找到 MasterSheet id。

我知道可以像我一样使用执行 API 运行脚本,但老实说,我有点费力地想办法让它工作。

对不起,如果我问的是一个简单的问题 - 我已经很好地搜索了它,但无法弄清楚。

非常感谢! 亚历克斯

注意这个Running a google script from within a spreadsheet, but as a different user? 看起来像一个类似的问题,但我真的很想将评论系统保留在用户的电子表格中。

【问题讨论】:

  • doPost(e) 函数放入绑定到主电子表格的项目中。然后将脚本发布为 Web 应用程序。将原始函数保留在将分发给用户的电子表格中,但您将剥离所有当前代码,并将其放入绑定到主电子表格的项目中的函数中。当前将数据写入主电子表格的当前函数将不再直接执行此操作。分布式电子表格中的当前函数将调用主电子表格中的doGet(e)函数,并将数据发送到e中。

标签: google-apps-script google-sheets


【解决方案1】:

您可以从分发给用户的电子表格中向主电子表格发出 POST 请求:

Apps Script Documentation - UrlFetchApp.fetch()

function saveCommentToMasterSheet(form) {//Function in the 
  //spreadsheets distributed to the users 
  var options,responseCode,url;

  url = "https://script.google.com/macros/s/File_ID/exec";//Get from publishing

  options = {};
  options.method = 'post';
  options.payload = form;

  responseCode = UrlFetchApp.fetch(url, options).getResponseCode();

  Logger.log('responseCode: ' + responseCode);//View the Logs
};

以上代码会触发主电子表格中的doPost(e)函数,并将数据放入事件对象e中。

然后您可以从e 中取出数据,并将数据直接写入活动电子表格,即主电子表格。发布 Web 应用程序以作为“我”运行。

已发布的 Web App 有两个版本; “开发”版本和“执行”版本。 “开发”版本始终包含最新更改,但绝不应在生产中使用。每次您再次发布脚本时,“exec”版本都会有一个新版本。要在生产中使用最新的“exec”版本,您必须不断发布最新的代码。

【讨论】:

  • 非常感谢 - 做到了。当我将用户 ID 号添加到表单有效负载时,它也有助于简化它。对于其他阅读的人 - 这花了我更长的时间,因为我没有意识到您必须发布新版本的网络应用程序(不仅仅是更新当前版本)才能更新工作表。
  • 感谢您让我知道您已经成功了。我更新了答案以解释“exec”版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多