Google onEdit 脚本显示 API 调用错误

Google Scripts onEdit showing API Call Error

我有一个系统可以从我的员工填写的工单中收集时间,并每天在一个通用时间表中收集这些信息。对于每项工作,我们都在复制一个模板并用新信息填充它。我需要自动触发器,因为有些作业有 10 个条目,而有些 运行 更长,可能有 75-100 个条目。我正在尝试创建的是一个自动功能,用于将工作单中的信息复制到一个可以通过日常触发 运行s 的通用时间表脚本轻松访问的位置。

每个用户授权每个工作单更新他们的时间是非常笨拙的。此外,从用户的角度来看,他们就是不会这样做。我试图设置一个 onEdit 函数,这样它会自动 运行 而无需他们批准,但是当我这样做时我得到“GoogleJsonResponseException:API 调用 sheets.spreadsheets.values.get 失败并出现错误:请求缺少有效的 API 键。"

注意:我可以手动将函数设置为 运行,脚本编辑器不会出现任何问题。只有当它尝试自己 运行 时,我才会遇到问题。我还在 Advanced Google Services

上启用了 SheetsAPI

这是我在特定范围内更改 onEdit 的代码:

function onEdit(e) {
  if (
    e.source.getSheetName() == "Form" &&
    e.range.columnStart == 0 &&
    e.range.columnEnd == 7 &&
    e.range.rowStart >= 26 &&
    e.range.rowEnd <= 5000
  ) {
    GetHours();
  }
}

以及更新:

function GetHours() {
  var ss = SpreadsheetApp.getActive();
  var ssid = SpreadsheetApp.getActive().getId();
  var formssheet = ss.getSheetByName("Form");
  var scriptsheet = ss.getSheetByName("Script Work")
  var workrange = ss.getRange("Script Work!A23:E")
  var tactics = Sheets.Spreadsheets.Values.get(ssid, "Form!A27:H");
  var ticketno = Sheets.Spreadsheets.Values.get(ssid, "Form!B1").values;
  var jobname = Sheets.Spreadsheets.Values.get(ssid, "Form!D1").values;
  var array = []

  var currentDate = new Date();
  var pastweek = new Date();
  pastweek.setDate(currentDate.getDate() -8);

  workrange.clear()
     
     for(var i = 0; i < tactics.values.length; i++){
       var worker = tactics.values[i][0];        
       var hours = tactics.values[i][2];
       var date = tactics.values[i][4];
       var desc = tactics.values[i][6];
    
          if(worker !== ''){
            if(new Date(date) > pastweek){
              array.push([ticketno,jobname,worker,hours,date,desc]);
            }
          }
          else{
            break
            }  
        }
        
   if(array[0]){
    scriptsheet.getRange(scriptsheet.getLastRow()+1,1,array.length,6).setValues(array);
    }
}

问题:

They cannot access services that require authorization. For example, a simple trigger cannot send an email because the Gmail service requires authorization, but a simple trigger can translate a phrase with the Language service, which is anonymous.

解决方案 1:

改用Installable Triggers

Installable triggers, however, offer more flexibility than simple triggers: they can call services that require authorization, they offer several additional types of events including time-driven (clock) triggers, and they can be controlled programmatically.

简单与可安装:

解决方案 2:

另一种方法是您可以更改脚本获取值的方式。您可以使用:

formssheet.getRange("A27:H").getValues()

而不是

Sheets.Spreadsheets.Values.get(ssid, "Form!A27:H");

我真的不知道您在使用服务中的表格 API 时在想什么,但如果有理由,只需将其更改为如上所述的 Installable Trigger 就可以了。