You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:50:25