【问题标题】:Running an Apps Script stored in Google Drive from Google Sheets从 Google 表格运行存储在 Google 云端硬盘中的 Apps 脚本
【发布时间】:2023-02-10 03:43:16
【问题描述】:

我有一个 google 表格工作簿,它根据用户输入构建一个报告,该报告通过单击“按钮”(工作表本身的方形)运行。我想与我的团队共享此工作簿,他们需要创建工作簿的副本以便他们可以为自己生成多个报告。

但是,我也希望以后能够对代码进行更改,并避免让他们重新下载最新版本,因此我试图通过将 Apps 脚本文件放入我公司的共享 Google 云端硬盘来分散应用程序脚本文件,然后将工作簿脚本替换为在驱动器中加载该文件的函数。

到目前为止我有:

function getApp(){

var folderId = "<folder_id>";
var fileName = "<file_name>";
var scriptId = "<script_id>";

var folder = DriveApp.getFolderById(folderId);
var files = folder.getFilesByName(fileName);

var url = "https://script.google.com/feeds/download/export?id=" +
    scriptId + "&format=json"

var options = {
  "method": "GET",
  "headers": {
    "Authorization": "Bearer " +  ScriptApp.getOAuthToken()
  },

  "muteHttpExceptions": true
};

var response = UrlFetchApp.fetch(url, options);

dataContentAsString = response.getContentText();
fileContents = JSON.parse(dataContentAsString);

var codeFile = fileContents.files[1];

if (codeFile){
  var code = codeFile.source;
  eval(code);
  buildReport();
}
}

它获取索引 1 处的“文件”(一个包含脚本中所有函数的对象)并运行 buildReport 函数。当我执行 Logger.log(fileContents) 时,我可以看到整个脚本,所以我知道从 google drive 检索正在运行。

buildReport() 是“主”函数,然后调用其他函数,但是在运行它时,出现以下错误,这表明存在 Oauth 问题:

例外:您无权调用 SpreadsheetApp.getActive。所需权限: (https://www.googleapis.com/auth/spreadsheets.currentonly || https://www.googleapis.com/auth/spreadsheets)

  1. 这是否意味着尽管能够访问文件,但文件本身无法访问正在运行宏的工作表(包含脚本根据用户在单击按钮之前的初始输入操作的模板) ?

  2. 这是实现我想要的最好方法吗?

    更新

    我在工作簿中添加了一个触发器,它在打开电子表格时运行buildReport就好了(不是预期的行为,但至少它仍然以某种方式工作),但是当单击“构建报告”按钮时它显示错误仍然。

    1. 为什么本地脚本(即 google 工作表的本地脚本)在使用触发器时能够从 google 驱动器成功导入并运行 buildReport(),但在单击按钮执行相同操作时却不能?

【问题讨论】:

  • 注意:我还没有使用 GCP 项目进行设置
  • 您是否在实施的任何部分使用Simple Triggers?比如 onOpen(e)onInstall(e)onEdit(e)onSelectionChange(e)doGet(e)doPost(e)
  • 不,保存在谷歌驱动器中的脚本只是在按下一个按钮后完全运行,实际上不需要触发器。正如上面更新中强调的那样,使用 UI 添加触发器似乎运行从 gDrive 导入的脚本,但这不是我打算做的(它应该在按下按钮时运行)
  • 我很感兴趣,通过 onOpen 编辑,您可以使用电子表格“做事”,而无需事先授予电子表格权限。无论如何,当他们按下按钮时,他们必须授予 Drive (DriveApp) 权限并连接到外部服务 (urlFetchApp)。您可以添加“虚拟”行并对其进行注释(//SpreadseetApp.getActive;例如),以便在按下按钮时授予编辑 gsheets 的权限。您还可以将脚本部署为 library,他们不会使用 Drive 或 urlFetchapp 权限
  • 我知道没错,这很奇怪。添加虚拟行有效,谢谢!请问您可以添加为答案吗?

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


【解决方案1】:

如果您有一个独立脚本将“修改”用户当前的电子表格(或幻灯片,或...),但绑定到电子表格的脚本仅“调用”外部脚本,您可以在绑定中添加虚拟/注释行脚本,这样当用户运行绑定脚本时,也会询问独立脚本的权限。对不起,我的英语:D 在任何地方添加这一行都可以解决问题:

//SpreadsheetApp.getActive()

顺便说一句,我发现您分享脚本的方式非常有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2017-08-14
    • 2017-09-21
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多