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);
}
}
问题:
- 简单触发器有restrictions,其中之一是:
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, 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 就可以了。
我有一个系统可以从我的员工填写的工单中收集时间,并每天在一个通用时间表中收集这些信息。对于每项工作,我们都在复制一个模板并用新信息填充它。我需要自动触发器,因为有些作业有 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);
}
}
问题:
- 简单触发器有restrictions,其中之一是:
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, 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 就可以了。