【问题标题】:Google spreadsheet - script throws "Exceeded maximum execution time" errorGoogle 电子表格 - 脚本抛出“超过最大执行时间”错误
【发布时间】:2021-06-01 08:16:05
【问题描述】:

我有以下 google 脚本,它将针对“InputFromHospital”表中的 500 多行数据运行,并在执行过程中出现“Exceeded maximum execution time”错误。 p>

我还有几行代码,但在阅读了 StackOverflow 中的类似问题后,我删除并只保留了所需的行/源代码。我不确定如何进一步优化。

寻找您的建议/专业知识来优化并将执行时间减少到 5 分钟以下?

function feedToMasterAndPolice() {
  var ssbook = SpreadsheetApp.getActiveSpreadsheet();
  var srcSheet = ssbook.getSheetByName('MasterPatientData')
  var sLastRow = srcSheet.getLastRow() + 1
  var inputSheet = ssbook.getSheetByName('InputFromHospital')
  var iLastRow = inputSheet.getLastRow();
  var pSheet = ssbook.getSheetByName('DataToPolice')
  var pLastRow = pSheet.getLastRow() + 1;

  var todayDate = Utilities.formatDate(new Date(), "IST", "dd/MMM/yyyy")

  //Loop thru all rows in "Input.." sheet
  for (var i = 2; i <= iLastRow; i++) {
    //Reading contact number from "Input.." sheet
    var value = inputSheet.getRange(i, 5).getValue();
    var gID = "";
    if (value.toString.length > 0) {
      //Generating unique patient ID for each COVID Patient
      gID = "PID".concat(srcSheet.getLastRow());
      srcSheet.getRange(sLastRow, 1).setValue(gID.toString());
      //Looping thru all 8 colums in "Input" sheet
      for (var colN = 2; colN < 9; colN++) {
        var actCellVal = inputSheet.getRange(i, colN).getValue();
         //Set value for contact# and date values
        if (colN == 5 || colN == 6 || colN == 8) {
          srcSheet.getRange(sLastRow, colN).setValue(actCellVal)
        } else {
         //All String values - upper case
          srcSheet.getRange(sLastRow, colN).setValue(actCellVal.toString().toUpperCase())
        }
      }

      var cR = srcSheet.getLastRow();
      //Adding formula to calculate "DAYS SINCE ADMISSION" - example =if(A2<>"",TODAY()-F2,"")
      srcSheet.getRange(sLastRow, 9).setFormula("=if(A" + cR + "<>\"\",TODAY()-F" + cR + ",\"\")")
      //Adding formula to calculate "FOLLOW UP NEEDED" - example =if(I2<=Admin!$C$2,"YES","NO"
      srcSheet.getRange(sLastRow, 10).setFormula("=if(I" + cR + "<=\'Admin\'!$C$2,\"YES\",\"NO\")");
      //Add current date
      srcSheet.getRange(sLastRow, 11).setValue(todayDate);

      sLastRow = sLastRow + 1

    } else {
      //Above logic same when contact number is blank
      //Not considerd Patient ID #
      var ppID = "NCPID".concat(pSheet.getLastRow());
      //Untested
      pSheet.getRange(pLastRow, 1).clear();
      pSheet.getRange(pLastRow, 1).setValue(ppID.toString());
      //till above
      for (var colN = 2; colN <= 9; colN++) {
        var actCellVal = inputSheet.getRange(i, colN).getValue();
        if (colN == 6 || colN == 8) {
          pSheet.getRange(pLastRow, colN).setValue(actCellVal)
        } else {
          pSheet.getRange(pLastRow, colN).setValue(actCellVal.toString().toUpperCase())
          pSheet.getRange(pLastRow, 9).setValue(todayDate);
        }
      }
      pLastRow = pLastRow + 1
    }
  }
   //this.ClearAnySheet("InputFromHospital")
};

提供示例文件here

【问题讨论】:

  • 在你的脚本中,我可以在if (value.toString.length &gt; 0)问你想做什么吗?
  • 如果电话号码是空的,那么它应该转到“DataToPolice”表,上面是相同的验证。
  • 添加了 cmets 以便于理解。
  • 感谢您回复并添加更多信息。不幸的是,我无法根据您的实际情况测试上述修改后的脚本。所以当我提出的脚本不能用于你的实际情况时,我很抱歉。那时,您能否提供用于复制问题的示例电子表格?借此,我想确认一下。

标签: google-apps-script google-sheets


【解决方案1】:

我相信你的目标如下。

  • 您希望降低脚本的处理成本。

修改脚本:

function feedToMasterAndPolice_b() {
  var ssbook = SpreadsheetApp.getActiveSpreadsheet();
  var srcSheet = ssbook.getSheetByName('MasterPatientData');
  var sLastRow = srcSheet.getLastRow() + 1;
  var inputSheet = ssbook.getSheetByName('InputFromHospital');
  var pSheet = ssbook.getSheetByName('DataToPolice');
  var pLastRow = pSheet.getLastRow() + 1;
  var todayDate = Utilities.formatDate(new Date(), "IST", "dd/MMM/yyyy");


  var [, ...values] = inputSheet.getDataRange().getValues();
  var { masterPatientData, dataToPolice } = values.reduce((o, [c1, c2, c3, c4, c5, c6, c7, c8], i) => {
    if (c5.toString() != "") {
      var last = sLastRow - 1 + o.masterPatientData.length;
      o.masterPatientData.push([
        `PID${last}`,
        ...[c2, c3, c4, c5, c6, c7, c8].map((c, j) => [3, 4, 6].includes(j) ? c : c.toString().toUpperCase()),
        `=if(A${last + 1}<>"",TODAY()-F${last + 1},"")`,
        `=if(I${last + 1}<='Admin'!\$C\$2,"YES","NO")`,
        todayDate,
      ]);
    } else {
      var last = pLastRow - 1 + o.dataToPolice.length;
      o.dataToPolice.push([
        `NCPID${last}`,
        ...[c2, c3, c4, c5, c6, c7, c8].map((c, j) => [4, 6].includes(j) ? c : c.toString().toUpperCase()),
        todayDate,
      ]);
    }
    return o;
  }, { masterPatientData: [], dataToPolice: [] });
  if (masterPatientData.length > 0) {
    srcSheet.getRange(sLastRow, 1, masterPatientData.length, masterPatientData[0].length).setValues(masterPatientData);
  }
  if (dataToPolice.length > 0) {
    pSheet.getRange(pLastRow, 1, dataToPolice.length, dataToPolice[0].length).setValues(dataToPolice);
  }
}

注意:

  • 很遗憾,我无法根据您的实际情况测试上述修改后的脚本。因此,当我提出的脚本不能用于您的实际情况时,您能否提供示例电子表格来复制问题?借此,我想确认一下。

参考资料:

【讨论】:

  • 谢谢你,我试过上面的代码,现在我有以下错误TypeError: Cannot read property 'length' of undefined,还在问题中为你添加了文件。
  • @Dhamo 感谢您的回复。我带来的不便表示歉意。不幸的是,来自TypeError: Cannot read property 'length' of undefined,我无法了解您目前的情况。这是因为我的技术不好。我为我糟糕的技术深表歉意。为了正确了解您当前的情况,您能否提供用于复制问题的示例电子表格?借此,我想确认一下。我再次为我糟糕的技能深表歉意。
  • 感谢您随时准备提供帮助。我已经编辑了问题并添加了电子表格。或者,您可以click here 获得相同的结果。
  • @Dhamo 感谢您回复并提供样本。您的示例似乎不是 Google 电子表格。但在你的实际情况下,那是谷歌电子表格。如果我的理解是正确的,请再次确认我更新的答案。如果这不是您期望的方向,我再次道歉。
  • @Dhamo 感谢您的回复和测试。我很高兴你的问题得到了解决。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多