【发布时间】: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)
这是否意味着尽管能够访问文件,但文件本身无法访问正在运行宏的工作表(包含脚本根据用户在单击按钮之前的初始输入操作的模板) ?
这是实现我想要的最好方法吗?
更新
我在工作簿中添加了一个触发器,它在打开电子表格时运行
buildReport就好了(不是预期的行为,但至少它仍然以某种方式工作),但是当单击“构建报告”按钮时它显示错误仍然。
- 为什么本地脚本(即 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