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();
  }

}