Google Sheets脚本循环仅执行1次而非800+次的问题求助
Google Sheets脚本循环异常:800+长度数组仅执行1次循环
- 接手前任IT人员编写的Google Sheets脚本,出现异常:原本应执行800+次的for循环仅运行1次。
- Logger.log显示
invoiceRows数组长度为800+,首尾元素均正常,循环条件为for(var i=0 ; i<invoiceRows.length ; i++){,但仅i=0时执行,循环结束后i=1。 - 脚本中用于安全校验的break未触发日志,无异常抛出,此前使用的while循环也存在同样问题。
- 脚本逻辑:读取发票行数据,逐行填充模板工作表、生成PDF并将PDF链接写入对应行。
相关代码如下:
// BOUCLE DE TRAITEMENT DES DONNEES Logger.log('BOUCLE - avant ; nb d\'itérations: '+invoiceRows.length); for(var i=0 ; i<invoiceRows.length ; i++){ var currentRow = startRow+i; Logger.log(' - boucle item #'+i+", row #"+currentRow+": "+invoiceRows[i]); if(invoiceRows[i][0]==""){ Logger.log(' id vide => break'); break; } Logger.log(' id #'+i+": "+invoiceRows[i][0]); if (true) { // une raison de ne pas traiter la ligne ? Déjà faite ? templateSheet.getRange("F10").setValue(invoiceRows[0][headerObj["Account Billing Address"]].replace(/<br>/g, "\n")); templateSheet.getRange("A17").setValue(invoiceRows[0][headerObj["Invoice: Name"]].split(" ")[0]); templateSheet.getRange("A18").setValue(invoiceRows[0][headerObj["Invoice: Name"]]); templateSheet.getRange("G18").setValue(invoiceRows[0][headerObj["Date"]]); templateSheet.getRange("G14").setValue(invoiceRows[0][headerObj["Account Siret"]]); templateSheet.getRange("G15").setValue(invoiceRows[0][headerObj["Account TVA"]]); templateSheet.getRange("B20").setValue(invoiceRows[0][headerObj["Account RRF"]]); templateSheet.getRange("A22").setValue(invoiceRows[0][headerObj["Title"]]); templateSheet.getRange("D22").setValue(invoiceRows[0][headerObj["Princing - Per Unit"]]); templateSheet.getRange("F22").setValue(invoiceRows[0][headerObj["Princing - Nb of units"]]); templateSheet.getRange("A24").setValue(invoiceRows[0][headerObj["Princing - Modify label"]]); templateSheet.getRange("G24").setValue(invoiceRows[0][headerObj["Princing - Modify value"]]); //templateSheet.getRange("F38").setValue((invoiceRows[0][headerObj["Princing - TVA"]] || 0) / 100); templateSheet.getRange("F38").setValue(invoiceRows[0][headerObj["Princing - TVA"]]+"%"); templateSheet.getRange("B42").setValue(invoiceRows[0][headerObj["Account Payment Terms"]]); templateSheet.getRange("B45").setValue(invoiceRows[0][headerObj["Account Mode de paiement"]]); templateSheet.getRange("F9").setValue(invoiceRows[0][headerObj["Account Commercial Name"]]); templateSheet.getRange("D23").setValue(invoiceRows[0][headerObj["Princing - Flat Fee"]]); templateSheet.getRange("B21").setValue(invoiceRows[0][headerObj["Campaign Scope"]]); Logger.log('template updated'); var sheetToPrint = templateSheet.copyTo(dummySpreadsheet); SpreadsheetApp.flush(); Logger.log('template copied into dummySpreadsheet'); var totalFromTable = invoicesSheet.getRange(currentRow, parseInt(headerObj["Total HT"], 10) + 1).getValue(); Logger.log('total HT: '+totalFromTable); var totalTemplate = templateSheet.getRange("G36").getValue(); Logger.log('total HT calculé dans le template: '+totalTemplate); // contrôle si montant ht est cohérent entre ligne et template => poursuivre if ( parseFloat(templateSheet.getRange("G36").getValue()).toFixed(2) == parseFloat(totalFromTable).toFixed(2) && totalFromTable ) { Logger.log("contrôle cohérent entre template et ligne"); var dummySheets = dummySpreadsheet.getSheets(); for (var b = 0; b < dummySheets.length; b++) { if (dummySheets[b].getName() != sheetToPrint.getName()) { dummySpreadsheet.deleteSheet(dummySheets[b]) } } var blob = dummySpreadsheet.getAs("application/pdf"); blob.setName(invoiceRows[0][1] + '.pdf'); var uid = null; var printId = null; if (!folder) { var folder = DriveApp.getFolderById("fakegooglefolderid"); } var file = folder.createFile(blob); Logger.log("file: "+JSON.stringify(file, null, 2)); Logger.log('headerObj["Drive Link"]: '+JSON.stringify(headerObj["Drive Link"], null, 2)); invoicesSheet.getRange(currentRow, parseInt(headerObj["Drive Link"], 10) + 1).setValue(file.getUrl()) SpreadsheetApp.flush(); } // fin du contrôle cohérent total ttc // cas où il n'y a pas de total ht else if(!totalFromTable) { invoicesSheet.getRange(currentRow, parseInt(headerObj["Error"], 10) + 1).setValue("Empty total value") } else if (parseFloat(templateSheet.getRange("G36").getValue()).toFixed(2) != parseFloat(totalFromTable).toFixed(2)) { invoicesSheet.getRange(currentRow, parseInt(headerObj["Error"], 10) + 1).setValue("Values not matching") } else { invoicesSheet.getRange(currentRow, parseInt(headerObj["Error"], 10) + 1).setValue("Unknown") } } else{ // si ligne pas traitée } invoiceRows = invoicesSheet.getRange(currentRow, 1, 1, lastColumn).getDisplayValues(); Logger.log(' fin de boucle i='+i); } Logger.log('BOUCLE - après ; items traités: '+i);
该脚本此前正常运行多年,上月仍可正常使用,请问是否存在Google Sheets脚本已知Bug?
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

