onEdit 触发器 'failed' 或 'timed out'
onEdit trigger 'failed' or 'timed out'
我创建了一个考勤系统,使用基本脚本从考勤表中复制数据(标记出勤并将其粘贴到响应中sheet(表单响应 1)。有两种方式可以提交响应. 1) 通过使用运行 submitData 功能的 'Submit' 按钮,该功能仅适用于 pc/laptop 而不适用于 google sheet 的移动应用程序。 2. 对于 google sheet 移动应用程序,创建了带有 onEdit 触发器的下拉菜单。当用户在单元格 E1 的下拉列表中选择选项时,onEdit 运行与选项 1 中的 'Submit' 按钮相同的脚本(或相同的 submitData 函数。
现在使用“提交”按钮的 submitData 函数的成功率为 100%,但 onEdit 触发器有时会在两者之间停止。 (您可以在 sheet 的 'Form Responses 1' 选项卡的第 85 行看到不完整的响应。我检查执行时出现的错误 - 'Failed' 和 'Timed out'
知道为什么会发生这种情况以及如何纠正它吗?
Link到传播sheet-https://docs.google.com/spreadsheets/d/1YoAE4lT50oLxZLpa92h1zuSQIu2N2WtBr5Y1MuHmdzM/edit#gid=1611147373
仅供参考 - 我正在从另一个 sheet 中提取学生姓名和其他详细信息。
复制粘贴数据的脚本
function submitData(){
//declare variable and set the reference at active google sheet
var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet();
var shMarkAttendance = myGoogleSheet.getSheetByName("Mark_attendance");
var dataSheet = myGoogleSheet.getSheetByName("Form responses 1");
var blankRow = dataSheet.getLastRow() +1 ; //Next blank row
//to create the instance of user interface environment to use the alert features
var ui = SpreadsheetApp.getUi();
if(shMarkAttendance.getRange("A8:D9").getValue() != "**Please press SUBMIT to mark the attendance**") {
return; // to exit
}
//code to update data in Form responses 1
if(shMarkAttendance.getRange("A8:D9").getValue() == "**Please press SUBMIT to mark the attendance**") {
dataSheet.showSheet()
dataSheet.getRange(blankRow, 1). setValue(shMarkAttendance.getRange("D1").getValue()); //timestamp
dataSheet.getRange(blankRow, 2). setValue(shMarkAttendance.getRange("C2:D2").getValue()) // center
dataSheet.getRange(blankRow, 3). setValue(shMarkAttendance.getRange("C3:D3").getValue()); // Batch
dataSheet.getRange(blankRow, 4). setValue(shMarkAttendance.getRange("C4:D4").getValue()); // Session date
dataSheet.getRange(blankRow, 5). setValue(shMarkAttendance.getRange("I5").getValue()); // Session start time
dataSheet.getRange(blankRow, 6). setValue(shMarkAttendance.getRange("F2:G2").getValue()); // Other coaches present
dataSheet.getRange(blankRow, 7). setValue(shMarkAttendance.getRange("B6:D6").getValue()); // Your Name
dataSheet.getRange(blankRow, 8). setValue(shMarkAttendance.getRange("J5").getValue()); //Duration
dataSheet.getRange(blankRow, 9). setValue(shMarkAttendance.getRange("J9").getValue()); // Present
dataSheet.getRange(blankRow, 10). setValue(shMarkAttendance.getRange("K9").getValue()); // Absent
dataSheet.getRange(blankRow, 11). setValue(shMarkAttendance.getRange("L9").getValue()); // Late
dataSheet.getRange(blankRow, 12). setValue(shMarkAttendance.getRange("F4:G4").getValue()); // Type of session
dataSheet.getRange(blankRow, 13). setValue(shMarkAttendance.getRange("G3").getValue()); // without Hi5 jerseys
dataSheet.getRange(blankRow, 14). setValue(shMarkAttendance.getRange("B7:D7").getValue()); //Any notes or observations
dataSheet.getRange(blankRow, 15). setValue(shMarkAttendance.getRange("F6:G6").getValue()); //Session plan followed
dataSheet.getRange(blankRow, 16). setValue(shMarkAttendance.getRange("G7").getValue()); //Weekly plan
//to clear the mark attendance form
shMarkAttendance.getRange("C3:D3").clearContent(); //Batch
shMarkAttendance.getRange("C4:D4").clearContent(); // session date
shMarkAttendance.getRange("B5:D5").clearContent(); //Session start time
shMarkAttendance.getRange("F2:G2").clearContent(); //Other coaches present
shMarkAttendance.getRange("B6:D6").clearContent(); //Your name
shMarkAttendance.getRange("F4:G4").clearContent(); // Type of session
shMarkAttendance.getRange("F5:G5").clearContent(); // Duration
shMarkAttendance.getRange("G3").clearContent(); // Without hi5 jersey
shMarkAttendance.getRange("B7:D7").clearContent(); //Notes/observations
shMarkAttendance.getRange("F6:G6").clearContent(); // session plan followed
shMarkAttendance.getRange("G7").clearContent(); // Weekly plan
shMarkAttendance.getRange("E1").clearContent(); // Submit button
shMarkAttendance.getRange('E10:G60').activate();
shMarkAttendance.getActiveRangeList().check();
shMarkAttendance.getActiveRangeList().uncheck();
dataSheet.hideSheet();
}
}
onEdit trigger to run the submitData function
function onEdit(e) {
if (e.range.getA1Notation() == 'E1') {
if (/^\w+$/.test(e.value)) {
eval(e.value)();
e.range.clear();
}
}
}
试试这个(来自 //code to update data in Form responses 1
),它会加速并防止任何失败
您需要启用服务Google Sheets API(见脚本编辑器左侧
//code to update data in Form responses 1
if (shMarkAttendance.getRange("A8:D9").getValue() == "**Please press SUBMIT to mark the attendance**") {
//dataSheet.showSheet()
const ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
const source = shMarkAttendance.getSheetName();
const rng = ["D1", "C2", "C3", "C4", "I5", "F2", "B6", "J5", "J9", "K9", "L9", "F4", "G3", "B7", "F6", "G7"].map(e => `'${source}'!${e}`);
const values = Sheets.Spreadsheets.Values.batchGet(ssId, { ranges: rng })
var data = []
values.valueRanges.forEach(e => data.push(e.values ? e.values.flat().toString() : ""))
dataSheet.appendRow(data)
//to clear the mark attendance form
shMarkAttendance.getRangeList(["C3", "C4", "B5", "F2", "B6", "F4", "F5", "G3", "B7", "F6", "G7", "E1"]).clearContent()
shMarkAttendance.getRange('E10:G60').check();
shMarkAttendance.getRange('E10:G60').uncheck();
//dataSheet.hideSheet();
}
但是,onEdit 与 batchGet 不兼容
修改脚本如下
function onEdit(e) {
if (e.range.getA1Notation() == 'E1') {
if (/^\w+$/.test(e.value)) {
eval(e.value)();
e.range.clear();
}
}
}
function submitData() {
//declare variable and set the reference at active google sheet
var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet();
var shMarkAttendance = myGoogleSheet.getSheetByName("Mark_attendance");
var dataSheet = myGoogleSheet.getSheetByName("Form responses 1");
//code to update data in Form responses 1
if (shMarkAttendance.getRange("A8:D9").getValue() == "**Please press SUBMIT to mark the attendance**") {
//dataSheet.showSheet()
const cells = ["D1", "C2", "C3", "C4", "I5", "F2", "B6", "J5", "J9", "K9", "L9", "F4", "G3", "B7", "F6", "G7"]
var data = [];
for (var cell of cells) data.push(shMarkAttendance.getRange(cell).getValue());
dataSheet.appendRow(data)
//to clear the mark attendance form
shMarkAttendance.getRangeList(["C3", "C4", "B5", "F2", "B6", "F4", "F5", "G3", "B7", "F6", "G7", "E1"]).clearContent()
shMarkAttendance.getRange('E10:G60').check();
shMarkAttendance.getRange('E10:G60').uncheck();
//dataSheet.hideSheet();
}
}
我创建了一个考勤系统,使用基本脚本从考勤表中复制数据(标记出勤并将其粘贴到响应中sheet(表单响应 1)。有两种方式可以提交响应. 1) 通过使用运行 submitData 功能的 'Submit' 按钮,该功能仅适用于 pc/laptop 而不适用于 google sheet 的移动应用程序。 2. 对于 google sheet 移动应用程序,创建了带有 onEdit 触发器的下拉菜单。当用户在单元格 E1 的下拉列表中选择选项时,onEdit 运行与选项 1 中的 'Submit' 按钮相同的脚本(或相同的 submitData 函数。 现在使用“提交”按钮的 submitData 函数的成功率为 100%,但 onEdit 触发器有时会在两者之间停止。 (您可以在 sheet 的 'Form Responses 1' 选项卡的第 85 行看到不完整的响应。我检查执行时出现的错误 - 'Failed' 和 'Timed out'
知道为什么会发生这种情况以及如何纠正它吗?
Link到传播sheet-https://docs.google.com/spreadsheets/d/1YoAE4lT50oLxZLpa92h1zuSQIu2N2WtBr5Y1MuHmdzM/edit#gid=1611147373
仅供参考 - 我正在从另一个 sheet 中提取学生姓名和其他详细信息。
复制粘贴数据的脚本
function submitData(){
//declare variable and set the reference at active google sheet
var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet();
var shMarkAttendance = myGoogleSheet.getSheetByName("Mark_attendance");
var dataSheet = myGoogleSheet.getSheetByName("Form responses 1");
var blankRow = dataSheet.getLastRow() +1 ; //Next blank row
//to create the instance of user interface environment to use the alert features
var ui = SpreadsheetApp.getUi();
if(shMarkAttendance.getRange("A8:D9").getValue() != "**Please press SUBMIT to mark the attendance**") {
return; // to exit
}
//code to update data in Form responses 1
if(shMarkAttendance.getRange("A8:D9").getValue() == "**Please press SUBMIT to mark the attendance**") {
dataSheet.showSheet()
dataSheet.getRange(blankRow, 1). setValue(shMarkAttendance.getRange("D1").getValue()); //timestamp
dataSheet.getRange(blankRow, 2). setValue(shMarkAttendance.getRange("C2:D2").getValue()) // center
dataSheet.getRange(blankRow, 3). setValue(shMarkAttendance.getRange("C3:D3").getValue()); // Batch
dataSheet.getRange(blankRow, 4). setValue(shMarkAttendance.getRange("C4:D4").getValue()); // Session date
dataSheet.getRange(blankRow, 5). setValue(shMarkAttendance.getRange("I5").getValue()); // Session start time
dataSheet.getRange(blankRow, 6). setValue(shMarkAttendance.getRange("F2:G2").getValue()); // Other coaches present
dataSheet.getRange(blankRow, 7). setValue(shMarkAttendance.getRange("B6:D6").getValue()); // Your Name
dataSheet.getRange(blankRow, 8). setValue(shMarkAttendance.getRange("J5").getValue()); //Duration
dataSheet.getRange(blankRow, 9). setValue(shMarkAttendance.getRange("J9").getValue()); // Present
dataSheet.getRange(blankRow, 10). setValue(shMarkAttendance.getRange("K9").getValue()); // Absent
dataSheet.getRange(blankRow, 11). setValue(shMarkAttendance.getRange("L9").getValue()); // Late
dataSheet.getRange(blankRow, 12). setValue(shMarkAttendance.getRange("F4:G4").getValue()); // Type of session
dataSheet.getRange(blankRow, 13). setValue(shMarkAttendance.getRange("G3").getValue()); // without Hi5 jerseys
dataSheet.getRange(blankRow, 14). setValue(shMarkAttendance.getRange("B7:D7").getValue()); //Any notes or observations
dataSheet.getRange(blankRow, 15). setValue(shMarkAttendance.getRange("F6:G6").getValue()); //Session plan followed
dataSheet.getRange(blankRow, 16). setValue(shMarkAttendance.getRange("G7").getValue()); //Weekly plan
//to clear the mark attendance form
shMarkAttendance.getRange("C3:D3").clearContent(); //Batch
shMarkAttendance.getRange("C4:D4").clearContent(); // session date
shMarkAttendance.getRange("B5:D5").clearContent(); //Session start time
shMarkAttendance.getRange("F2:G2").clearContent(); //Other coaches present
shMarkAttendance.getRange("B6:D6").clearContent(); //Your name
shMarkAttendance.getRange("F4:G4").clearContent(); // Type of session
shMarkAttendance.getRange("F5:G5").clearContent(); // Duration
shMarkAttendance.getRange("G3").clearContent(); // Without hi5 jersey
shMarkAttendance.getRange("B7:D7").clearContent(); //Notes/observations
shMarkAttendance.getRange("F6:G6").clearContent(); // session plan followed
shMarkAttendance.getRange("G7").clearContent(); // Weekly plan
shMarkAttendance.getRange("E1").clearContent(); // Submit button
shMarkAttendance.getRange('E10:G60').activate();
shMarkAttendance.getActiveRangeList().check();
shMarkAttendance.getActiveRangeList().uncheck();
dataSheet.hideSheet();
}
}
onEdit trigger to run the submitData function
function onEdit(e) {
if (e.range.getA1Notation() == 'E1') {
if (/^\w+$/.test(e.value)) {
eval(e.value)();
e.range.clear();
}
}
}
试试这个(来自 //code to update data in Form responses 1
),它会加速并防止任何失败
您需要启用服务Google Sheets API(见脚本编辑器左侧
//code to update data in Form responses 1
if (shMarkAttendance.getRange("A8:D9").getValue() == "**Please press SUBMIT to mark the attendance**") {
//dataSheet.showSheet()
const ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
const source = shMarkAttendance.getSheetName();
const rng = ["D1", "C2", "C3", "C4", "I5", "F2", "B6", "J5", "J9", "K9", "L9", "F4", "G3", "B7", "F6", "G7"].map(e => `'${source}'!${e}`);
const values = Sheets.Spreadsheets.Values.batchGet(ssId, { ranges: rng })
var data = []
values.valueRanges.forEach(e => data.push(e.values ? e.values.flat().toString() : ""))
dataSheet.appendRow(data)
//to clear the mark attendance form
shMarkAttendance.getRangeList(["C3", "C4", "B5", "F2", "B6", "F4", "F5", "G3", "B7", "F6", "G7", "E1"]).clearContent()
shMarkAttendance.getRange('E10:G60').check();
shMarkAttendance.getRange('E10:G60').uncheck();
//dataSheet.hideSheet();
}
但是,onEdit 与 batchGet 不兼容
修改脚本如下
function onEdit(e) {
if (e.range.getA1Notation() == 'E1') {
if (/^\w+$/.test(e.value)) {
eval(e.value)();
e.range.clear();
}
}
}
function submitData() {
//declare variable and set the reference at active google sheet
var myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet();
var shMarkAttendance = myGoogleSheet.getSheetByName("Mark_attendance");
var dataSheet = myGoogleSheet.getSheetByName("Form responses 1");
//code to update data in Form responses 1
if (shMarkAttendance.getRange("A8:D9").getValue() == "**Please press SUBMIT to mark the attendance**") {
//dataSheet.showSheet()
const cells = ["D1", "C2", "C3", "C4", "I5", "F2", "B6", "J5", "J9", "K9", "L9", "F4", "G3", "B7", "F6", "G7"]
var data = [];
for (var cell of cells) data.push(shMarkAttendance.getRange(cell).getValue());
dataSheet.appendRow(data)
//to clear the mark attendance form
shMarkAttendance.getRangeList(["C3", "C4", "B5", "F2", "B6", "F4", "F5", "G3", "B7", "F6", "G7", "E1"]).clearContent()
shMarkAttendance.getRange('E10:G60').check();
shMarkAttendance.getRange('E10:G60').uncheck();
//dataSheet.hideSheet();
}
}