【发布时间】: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 > 0)问你想做什么吗? -
如果电话号码是空的,那么它应该转到“DataToPolice”表,上面是相同的验证。
-
添加了 cmets 以便于理解。
-
感谢您回复并添加更多信息。不幸的是,我无法根据您的实际情况测试上述修改后的脚本。所以当我提出的脚本不能用于你的实际情况时,我很抱歉。那时,您能否提供用于复制问题的示例电子表格?借此,我想确认一下。
标签: google-apps-script google-sheets