【问题标题】:Google Sheets API - creating app scripts or attaching them to a Spreadsheet that was created with APIGoogle Sheets API - 创建应用脚本或将它们附加到使用 API 创建的电子表格
【发布时间】:2021-04-14 10:34:01
【问题描述】:

我正在使用 Google Sheets API 创建电子表格。我想在这张表中添加一个 onEdit 函数,该函数调用并执行 ajax 请求。

  1. 我想使用应用脚本 API 或电子表格 API 创建 onEdit 函数,例如:
// Following comment ensures UrlFetchApp authorization will be prompted:
// UrlFetchApp.fetch()

function onEdit(e) {
  var range = e.range
  var currentSheet = range.getSheet()
  var sheetId = currentSheet.getParent().getId(); 
  var url = 'https://example.com/synchronise?sheetId=' + sheetId;
  var response = JSON.parse(UrlFetchApp.fetch(url).getContentText());
}

我想将它附加到我使用 API 创建的工作表中。我的应用程序使用 Google OAuth,所以我希望我还可以处理作为 OAuth 身份验证过程的一部分进行外部调用所需的权限(但如果用户打开工作表时它会询问他们,那么我怀疑可能是这种情况? )

所以我的问题是什么是方法

a) 创建脚本并将其附加到工作表 b) 以编程方式(或通过 API)让用户接受调用脚本的权限?

我要复制的内容是转到工作表,单击工具->脚本编辑器并粘贴到函数中,但使用 API 执行此操作

【问题讨论】:

  • onEdit 触发器函数的最大执行时间为 30 秒。因此,不要计划一次处理多个用户。而且我认为您可能需要考虑使用 LockService。

标签: google-apps-script google-sheets google-sheets-api google-apps-script-api


【解决方案1】:

您可以使用Apps Script API添加container-bound script

做什么:

  1. 使用projecs.create 方法创建container-bound script

要设置容器绑定脚本,您需要将电子表格文件 id 分配给 parentId 参数

示例请求正文:

{
  "title": "new",
  "parentId": "spreadsheet file id"
}
  1. project response bodyprojecs.create方法中获取新创建的容器绑定script id

示例响应正文:

{
  "scriptId": "newly created script id",
  "title": "new",
  "parentId": "spreadsheet file id",
  "createTime": "2020-12-25T23:33:48.026Z",
  "updateTime": "2020-12-25T23:33:48.026Z"
}
  1. 使用projects.updateContent 方法更新新创建的绑定脚本的内容并包含您的函数。

示例请求正文:

{
  files: [{
      name: 'hello',
      type: 'SERVER_JS',
      source: 'function helloWorld() {\n  console.log("Hello, world!");\n}'
    }, {
      name: 'appsscript',
      type: 'JSON',
      source: "{\"timeZone\":\"America/New_York\",\"" +
      "exceptionLogging\":\"CLOUD\"}"
    }]
}

【讨论】:

  • 这很酷。谢谢你。我很快就会试一试!唯一的问题是 - 权限如何在这里工作?使用 App Script API 是一个简单的 OAuth 权限,但如果脚本本身需要电子表格所有者的权限,是否必须在工作表中手动接受,或者 oAuth 权限是否涵盖该权限?
  • 您在创建电子表格时是否使用了服务帐户?当我尝试这个时,我使用相同的帐户创建独立脚本,使用 api 生成电子表格并将脚本复制到新创建的电子表格
  • 我最近也尝试过,我使用 与人员和组共享选项将用户 1 拥有的脚本共享给用户 2,并且我能够获取使用用户 2 帐户的脚本。因此,只要用于生成电子表格的用户帐户可以访问要复制的主脚本,就应该没有问题。
  • 有趣。在实施之前,我将尝试确保我可以从第二个用户访问该脚本。顺便说一句,在gapi.client.script.projects.updateContent 行之后的示例中查看文档developers.google.com/apps-script/api/quickstart/js,看起来他们正在使用脚本内容更新文件数组 - 你提到这是不可能的。我是不是看错了,是 API 改变了,还是别的什么?如果可以动态创建脚本,那显然是最简单的......
  • 我会在开始实现此功能后回到它,外部调用触发器的权限可能是我在时机成熟时发现的答案。感谢您的帮助