Google Apps 脚本仅在一次迭代后就停止了

2023-12-11

我在谷歌应用程序脚本中有一个小函数,必须在 for 循环中执行一些操作,即我有 3 行,其中包含一些值,对于每一行,我必须更新一张表,但不幸的是,我不明白为什么,但在仅仅一个之后循环程序停止了!并且没有return声明。

这是代码:

function movimentiRicorrenti(){

  tempoInizioScript = new Date();

  var rigaInizio = 2

  Logger.log("Data e ora script movimenti ricorrenti: " + Utilities.formatDate(new Date(), "GMT+0200", "dd/MM/yyyy HH:mm"))

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ricorrenti")

  var ultimaRiga = sheet.getLastRow();  // ultima riga con i dati

  Logger.log("ultima riga " +ultimaRiga);

  var dataMovimento = Utilities.formatDate(new Date(), "GMT+0200", "dd/MM/yyyy");

  var dataRangeMovimento;

  var datiMovimento;

  var today = new Date();

  //----------  parte dalla prima riga fino all'ultima del foglio, verifica che il movimento non sia scaduto, verifica se in data odierna andrà eseguito ed esegue eventualmente l'update



for (i=rigaInizio; i<=ultimaRiga; i++){

     dataRangeMovimento = sheet.getRange(i, 1, 1, 9)
     datiMovimento = dataRangeMovimento.getValues();

     Logger.log(convertiMovR(datiMovimento[0][0],datiMovimento[0][1],datiMovimento[0][2],datiMovimento[0][3],datiMovimento[0][4],datiMovimento[0][5],datiMovimento[0][6],datiMovimento[0][7],datiMovimento[0][8]));


}
}

其他2个功能

 function convertiMovR(cr, cat, conto, importo, ricorrenza, giornoM, giornoS, giornoA, scadenza){

    today = new Date();
    if (typeof importo != "number"){
       return false;
    }
    if (scadenza >= today){
       if (ricorrenza == "mensile" && today.getDate() == giornoM){
         aggiornaBil(cr,cat,conto,importo,"movimento ricorrente ogni mese il giorno " + giornoM);
         return true;
       }
       if (ricorrenza == "annuale"){
         if (today.getMonth()+1 == giornoA.getMonth()+1 && today.getDate() == giornoA.getDate() + 1 && today.getYear() == giornoA.getYear()){
           aggiornaBil(cr,cat,conto,importo,"movimento ricorrente ogni anno il giorno "+ Utilities.formatDate(new Date(giornoA), "GMT+0200", "dd/MM/yyyy"));
           return true;
         }
       }
       if (ricorrenza == "giornaliera"){
          aggiornaBil(cr,cat,conto,importo,"movimento ricorrente giornaliero");
          return true;
       }
       if (ricorrenza == "settimanale"){
         var giornoSett = 7;
           switch(giornoS)  {
              case "domenica":
                  giornoSett = 0;
                  break;    
              case "lunedì":
                  giornoSett = 1;
                  break; 
              case "martedì":
                  giornoSett = 2;
                  break; 
              case "mercoledì":
                  giornoSett = 3;
                  break; 
              case "giovedì":
                  giornoSett = 4;
                  break;         
              case "venerdì":
                  giornoSett = 5;
                  break; 
              case "sabato":
                  giornoSett = 6;
                  break; 
           }
           if (giornoSett == 7){
                var corpo = "Verificare il movimento ricorrente alla riga " + i + " inserire un giorno della settimana dal lunedì alla domenica";
                MailApp.sendEmail("[email protected]", "Errore movimenti ricorrenti", corpo, {name: "Bilancio Gianluca", htmlBody: corpo})
                Logger.log("Script movimenti ricorrenti eseguito in data/ora " + Utilities.formatDate(new Date(), "GMT+0200", "dd/MM/yyyy hh:mm") + " con errori! Mail inviata a [email protected]")
           }

         if (new Date().getDay() == giornoSett){

             var nScript = sheet.getRange(i, 10).getValue();
             nScript = nScript + 1;
             sheet.getRange(i, 10).setValue(nScript);

             aggiornaBil(cr,cat,conto,importo,"movimento ricorrente ogni settimana di " + giornoS);
             return true;
         }
       }
    }
}


function aggiornaBil(CostoRicavo, Categoria, Conto, Importo, Descrizione){

  var dataMovimento = Utilities.formatDate(new Date(), "GMT+0200", "dd/MM/yyyy");

    if (CostoRicavo == "costo"){
      var rigaAgg = rigaAggiornamentoCosti(Conto);
      if (rigaAgg == 0){
        var corpo = "Il movimento inserito in data <b>" +
            Utilities.formatDate(new Date(), "GMT+0200", "dd/MM/yyyy")+
            "</b> relativo a <b>" + Conto +
            "</b> non ha corrispondenze in bilancio. Si prega di controllare il foglio di lavoro. Log di sistema:" + Logger.getLog() ;
          MailApp.sendEmail("[email protected]", "Errore corrispondenza in bilancio", corpo, {name: "Bilancio Gianluca", htmlBody: corpo})

          // uscita dalla sub
          Logger.log("Conto non corrispondente!! Mail inviata a [email protected]")
          return;
      }

      var foglioBilancio = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("bilancio")
      var rangeDaAggiornare = foglioBilancio.getRange(rigaAgg, colonnaCostiBilancio + 1)
      var importoDaAggiornare = rangeDaAggiornare.getValue();
      var importoAggiornato = importoDaAggiornare + Importo;
      Logger.log("Importo da aggiornare:" + cambiaSeparatore(importoDaAggiornare) + " - Importo aggiornato: " + cambiaSeparatore(arrotondaEuro(importoAggiornato)));
      rangeDaAggiornare.setValue(importoAggiornato);

   }
   if (CostoRicavo == "ricavo"){
      var rigaAgg = rigaAggiornamentoRicavi(Conto);
      if (rigaAgg == 0){
        var corpo = "Il movimento inserito in data <b>" +
            Utilities.formatDate(new Date(dataMovimento), "GMT+0200", "dd/MM/yyyy")+
            "</b> relativo a <b>" + Conto +
            "</b> non ha corrispondenze in bilancio. Si prega di controllare il foglio di lavoro. Log di sistema:" + Logger.getLog() ;
          MailApp.sendEmail("[email protected]", "Errore corrispondenza in bilancio", corpo, {name: "Bilancio Gianluca", htmlBody: corpo})

          // uscita dalla sub
          Logger.log("Conto non corrispondente!! Mail inviata a [email protected]")
          return;
      }

      var foglioBilancio = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("bilancio")
      var rangeDaAggiornare = foglioBilancio.getRange(rigaAgg, colonnaRicaviBilancio + 1)
      var importoDaAggiornare = rangeDaAggiornare.getValue();
      var importoAggiornato = importoDaAggiornare + Importo;
      Logger.log("Importo da aggiornare:" + cambiaSeparatore(importoDaAggiornare) + " - Importo aggiornato: " + cambiaSeparatore(arrotondaEuro(importoAggiornato)));
      rangeDaAggiornare.setValue(importoAggiornato);
   }


   var arrayMovimento = [[dataMovimento, CostoRicavo, Categoria, Conto, cambiaSeparatore(Importo), Descrizione]]

   Logger.log(arrayMovimento);

   var foglioMovimenti = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("movimenti")

   foglioMovimenti.insertRowAfter(1); 

   foglioMovimenti.getRange(2, 1, 1, 6).setValues(arrayMovimento);

   foglioMovimenti.getRange(3,8,1,1).copyTo(foglioMovimenti.getRange(2,8,1,1))

   foglioBilancio = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("verifica")
   rangeDaAggiornare = foglioBilancio.getRange(1, 5)
   importoDaAggiornare = rangeDaAggiornare.getValue();
   importoAggiornato = importoDaAggiornare + Importo;
   rangeDaAggiornare.setValue(importoAggiornato);


   Logger.log("Aggiornamento completato!");  
}

log:

[20-02-17 23:07:22:486 CET] Data e ora script movimenti ricorrenti: 18/02/2020 00:07
[20-02-17 23:07:22:757 CET] ultima riga 4
[20-02-17 23:07:23:206 CET] cellulare riga n. 63
[20-02-17 23:07:23:211 CET] Importo da aggiornare:-29 - Importo aggiornato: -31
[20-02-17 23:07:23:212 CET] [[18/02/2020, costo, comunicazioni, cellulare, -2, movimento ricorrente ogni anno il giorno 17/02/2020]]
[20-02-17 23:07:24:067 CET] Aggiornamento completato!
[20-02-17 23:07:24:067 CET] true

然后停了下来..但是还有另外两行..

放置 Logger.log("r:%s,u%s,%s",rigaInizio,ultimaRiga,"之前/之后") 后的结果convertiMovR

Logger.log("r:%s,u%s,%s",rigaInizio,ultimaRiga,"before")
Logger.log(convertiMovR(datiMovimento[0][0],datiMovimento[0][1],datiMovimento[0][2],datiMovimento[0][3],datiMovimento[0][4],datiMovimento[0][5],datiMovimento[0][6],datiMovimento[0][7],datiMovimento[0][8]));
Logger.log("r:%s,u%s,%s",rigaInizio,ultimaRiga,"after")

[20-02-17 23:18:41:155 PST] 数据和脚本移动: 18/02/2020 09:18

[20-02-17 23:18:41:422 PST] 里加最后4

[20-02-17 23:18:41:580 PST] r:2.0,u4.0,之前

[20-02-17 23:18:41:858 PST] 里加蜂窝63

[20-02-17 23:18:41:863 PST] 进口 aggiornare:-31 - 进口 aggiornato: -33

[20-02-17 23:18:41:865 PST] [[18/02/2020, costo, comunicazioni, Cellulare, -2, movimento ricorrente ogni anno il giorno 17/02/2020]]

[20-02-17 23:18:42:537 PST] 激动人心!

[20-02-17 23:18:42:538 PST] 正确

[20-02-17 23:18:42:538 PST] r:2.0,u4.0,之后

但是..也许我已经理解了... for.. next 循环不会等待convertiMovR 完成

我试着把

 Logger.log("value of i before call convertiMovR " + i)
 Logger.log("r:%s,u%s,%s",rigaInizio,ultimaRiga,"before")
 Logger.log(convertiMovR(datiMovimento[0][0],datiMovimento[0][1],datiMovimento[0][2],datiMovimento[0][3],datiMovimento[0][4],datiMovimento[0][5],datiMovimento[0][6],datiMovimento[0][7],datiMovimento[0][8]));
 Logger.log("r:%s,u%s,%s",rigaInizio,ultimaRiga,"after")
 Logger.log("value of i after call convertiMovR " + i)

结果是

[20-02-18 08:39:32:396 CET] Data e ora script movimenti ricorrenti: 18/02/2020 09:39
[20-02-18 08:39:32:678 CET] ultima riga 4
[20-02-18 08:39:32:807 CET] value of i before call convertiMovR 2
[20-02-18 08:39:32:808 CET] r:2.0,u4.0,before
[20-02-18 08:39:33:057 CET] cellulare riga n. 63
[20-02-18 08:39:33:061 CET] Importo da aggiornare:-41 - Importo aggiornato: -43
[20-02-18 08:39:33:062 CET] [[18/02/2020, costo, comunicazioni, cellulare, -2, movimento ricorrente ogni anno il giorno 17/02/2020]]
[20-02-18 08:39:33:706 CET] Aggiornamento completato!
[20-02-18 08:39:33:707 CET] true
[20-02-18 08:39:33:707 CET] r:2.0,u4.0,after
[20-02-18 08:39:33:708 CET] value of i after call convertiMovR 60

我想我必须用其他循环更改 for .. next 可能是 do..loop 或者有任何语句可以“等待”convertiMovR 的执行? ..

成绩单

[20-02-17 23:39:32:386 PST] Avvio dell'esecuzione
[20-02-17 23:39:32:395 PST] Utilities.formatDate([Mon Feb 17 23:39:32 PST 2020, GMT+0200, dd/MM/yyyy HH:mm]) [0 secondi]
[20-02-17 23:39:32:396 PST] Logger.log([Data e ora script movimenti ricorrenti: 18/02/2020 09:39, []]) [0 secondi]
[20-02-17 23:39:32:398 PST] SpreadsheetApp.getActiveSpreadsheet() [0 secondi]
[20-02-17 23:39:32:573 PST] SpreadsheetApp.Spreadsheet.getSheetByName([ricorrenti]) [0,175 secondi]
[20-02-17 23:39:32:678 PST] SpreadsheetApp.Sheet.getLastRow() [0,103 secondi]
[20-02-17 23:39:32:679 PST] Logger.log([ultima riga 4, []]) [0 secondi]
[20-02-17 23:39:32:679 PST] Utilities.formatDate([Mon Feb 17 23:39:32 PST 2020, GMT+0200, dd/MM/yyyy]) [0 secondi]
[20-02-17 23:39:32:680 PST] SpreadsheetApp.Sheet.getRange([2, 1, 1, 9]) [0 secondi]
[20-02-17 23:39:32:807 PST] SpreadsheetApp.Range.getValues() [0,127 secondi]
[20-02-17 23:39:32:808 PST] Logger.log([value of i before call convertiMovR 2, []]) [0 secondi]
[20-02-17 23:39:32:808 PST] Logger.log([r:%s,u%s,%s, [2.0, 4.0, before]]) [0 secondi]
[20-02-17 23:39:32:808 PST] Utilities.formatDate([Sun Feb 16 15:00:00 PST 2020, GMT+0200, dd/MM/yyyy]) [0 secondi]
[20-02-17 23:39:32:809 PST] Utilities.formatDate([Mon Feb 17 23:39:32 PST 2020, GMT+0200, dd/MM/yyyy]) [0 secondi]
[20-02-17 23:39:32:809 PST] SpreadsheetApp.getActiveSpreadsheet() [0 secondi]
[20-02-17 23:39:32:810 PST] SpreadsheetApp.Spreadsheet.getSheetByName([bilancio]) [0 secondi]
[20-02-17 23:39:32:910 PST] SpreadsheetApp.Sheet.getLastRow() [0,1 secondi]
[20-02-17 23:39:32:911 PST] SpreadsheetApp.Sheet.getRange([3, 1, 130, 1]) [0 secondi]
[20-02-17 23:39:33:056 PST] SpreadsheetApp.Range.getValues() [0,145 secondi]
[20-02-17 23:39:33:058 PST] Logger.log([cellulare riga n. 63, []]) [0 secondi]
[20-02-17 23:39:33:059 PST] SpreadsheetApp.getActiveSpreadsheet() [0 secondi]
[20-02-17 23:39:33:059 PST] SpreadsheetApp.Spreadsheet.getSheetByName([bilancio]) [0 secondi]
[20-02-17 23:39:33:060 PST] SpreadsheetApp.Sheet.getRange([63, 2]) [0 secondi]
[20-02-17 23:39:33:060 PST] SpreadsheetApp.Range.getValue() [0 secondi]
[20-02-17 23:39:33:062 PST] Logger.log([Importo da aggiornare:-41 - Importo aggiornato: -43, []]) [0 secondi]
[20-02-17 23:39:33:062 PST] SpreadsheetApp.Range.setValue([-43.0]) [0 secondi]
[20-02-17 23:39:33:063 PST] Logger.log([[[18/02/2020, costo, comunicazioni, cellulare, -2, movimento ricorrente ogni anno il giorno 17/02/2020]], []]) [0 secondi]
[20-02-17 23:39:33:064 PST] SpreadsheetApp.getActiveSpreadsheet() [0 secondi]
[20-02-17 23:39:33:064 PST] SpreadsheetApp.Spreadsheet.getSheetByName([movimenti]) [0 secondi]
[20-02-17 23:39:33:225 PST] SpreadsheetApp.Sheet.insertRowAfter([1]) [0,16 secondi]
[20-02-17 23:39:33:226 PST] SpreadsheetApp.Sheet.getRange([2, 1, 1, 6]) [0 secondi]
[20-02-17 23:39:33:431 PST] SpreadsheetApp.Range.setValues([[[18/02/2020, costo, comunicazioni, cellulare, -2, movimento ricorrente ogni anno il giorno 17/02/2020]]]) [0,205 secondi]
[20-02-17 23:39:33:432 PST] SpreadsheetApp.Sheet.getRange([3, 8, 1, 1]) [0 secondi]
[20-02-17 23:39:33:432 PST] SpreadsheetApp.Sheet.getRange([2, 8, 1, 1]) [0 secondi]
[20-02-17 23:39:33:433 PST] SpreadsheetApp.Range.copyTo([Range]) [0 secondi]
[20-02-17 23:39:33:433 PST] SpreadsheetApp.getActiveSpreadsheet() [0 secondi]
[20-02-17 23:39:33:434 PST] SpreadsheetApp.Spreadsheet.getSheetByName([verifica]) [0 secondi]
[20-02-17 23:39:33:434 PST] SpreadsheetApp.Sheet.getRange([1, 5]) [0 secondi]
[20-02-17 23:39:33:705 PST] SpreadsheetApp.Range.getValue() [0,27 secondi]
[20-02-17 23:39:33:706 PST] SpreadsheetApp.Range.setValue([-41.0]) [0 secondi]
[20-02-17 23:39:33:707 PST] Logger.log([Aggiornamento completato!, []]) [0 secondi]
[20-02-17 23:39:33:707 PST] Logger.log([true, []]) [0 secondi]
[20-02-17 23:39:33:708 PST] Logger.log([r:%s,u%s,%s, [2.0, 4.0, after]]) [0 secondi]
[20-02-17 23:39:33:709 PST] Logger.log([value of i after call convertiMovR 60, []]) [0 secondi]
[20-02-17 23:39:33:994 PST] Esecuzione riuscita [1,315 secondi di esecuzione totale]

Issue:

  • 修改i在循环之外。

解决方案:

  • 限制i到块作用域使用let

Snippet:

for (let i=rigaInizio; i<=ultimaRiga; i++){

参考:

  • let
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Apps 脚本仅在一次迭代后就停止了 的相关文章

随机推荐

  • 来自字典的数据帧,具有自动日期解析功能

    我正在从字典序列创建一个 Pandas DataFrame 这些词典很大而且有些异构 有些字段是日期 我想自动检测并解析日期字段 这可以通过以下方式实现 df0 pd Dataframe from dict dicts df0 to csv
  • 关闭窗口 - 但不停止程序 - JAVA

    在我的程序中 如果发生某个操作 它会打开一个窗口 当我在此窗口中填写信息并输入按钮后 窗口将出现 dispose 该窗口是在我的主程序之外的程序中拾取的 但是当我关闭该窗口时 我的主程序将停止 我怎样才能防止这种情况发生 感谢您的帮助 您可
  • 使用NVM在gitlab-ci中安装特定的nodejs版本

    当我尝试使用 gitlab ci 安装 NVM 时 收到以下错误消息 gitlab ci yml 文件 stages test Testing tags docker stage test image ubuntu 18 04 before
  • 为 Node.js 应用程序构建 docker 映像在代理后面失败

    我在 docker 构建期间遇到了 npm 问题 我是一家公司代理的幕后黑手 阅读了大约 30 篇解决类似问题的文章 以及 stackoverflow 帖子 然而我仍然无法克服这一点 我能够 npm install 项目并在 docker
  • Google Apps 脚本停止从雅虎财经抓取数据

    用于从雅虎财经抓取历史数据的 Google Apps 脚本代码昨天停止工作 它突然给出错误 没有数据 data length 0 我认为错误出现在获取 JSON 时的第 8 行脚本中 但我没有必要的技能来修复它 如果您能帮助解决问题 我们将
  • 将数据框重塑为宽形状

    数据包含两个变量 id 和grade 每个id可以有多个记录 每个年级 dat lt data frame id c 1 1 1 2 2 2 2 3 3 4 5 5 5 grade c a b c a a b b d f c a e f 我
  • phpunit 无法在全新安装的 laravel 5.7 上运行

    我新安装的 Laravel 遇到问题 当我尝试使用时phpunit运行默认命令ExampleTest php 我懂了error D Laravel Rahimi0151 gt phpunit PHP Warning continue tar
  • Maven - 测试中的不同依赖版本

    我遇到了类似的问题Maven 2 测试和编译中的不同依赖版本但那里指定的答案不起作用 在我的项目中 我需要依赖 Hadoop 的 Cloudera 发行版和用于 JUnit 测试的 vanilla 版本 因为前者仅适用于 nix 当我尝试执
  • 根据给定的开放日期和关闭日期,生成一段时间内开放门票的计数

    我有一些门票的一组数据 其中datetime它们打开和关闭的时间 或NULL如果它们仍然开放 opened on closed on 2019 09 01 17 00 2020 01 01 13 37 2020 04 14 11 00 20
  • 使用Java本机接口时如何解决“致命:重定位仍然针对可分配但不可写的部分”?

    我正在尝试在 Java 代码中调用 C 函数 我有这个哈瓦代码 public class JavaToC public native void helloC static System loadLibrary HelloWorld publ
  • Eclipse 和 Spring Beans 的 EL 自动完成/代码辅助

    在 Eclipse 中 JSF EL 的自动完成功能仅适用于旧版 ManagedBean或 CDI 豆 Named 至少在使用 JBoss 工具插件时是这样 也可以看看 使用 Eclipse 的 Facelets 中的 EL 建议 自动完成
  • 将组的最大值分配给该组中的所有行

    我想将一个组的最大值分配给该组内的所有行 我怎么做 我有一个数据框 其中包含组的名称以及属于该组的最大学分数 course credits lt aggregate bsc academic Credits by list bsc acad
  • Android 4.3:如何连接多个蓝牙低功耗设备

    我的问题是 Android 4 3 客户端 可以与多个 BLE 设备 服务器 建立活动连接吗 如果是这样 我怎样才能实现它 到目前为止我做了什么 我尝试评估使用 BLE 和 Android 4 3 BLE API 可以实现的吞吐量 此外 我
  • 防止在 Windows 窗体中打开组合框控件的下拉区域

    我在 Windows 窗体中有一个自定义组合框控件 我想实现一个功能 其中根据某些条件不应显示下拉区域 即我需要防止组合框根据某些条件打开 我找到了一个可以实现此目的的链接 但它完全阻止了下拉区域的显示 我也无法根据自己的方便调整该方法 链
  • 通过忽略div标签javascript的内部元素来选择文本

  • pyodbc和ms access 2010连接错误

    如何使用 pyodbc 访问我的 Microsoft Access 2010 数据库 accdb 之前 我使用了 mdb 数据库 它在连接字符串为 ODBC CONN STR DRIVER Microsoft Access Driver m
  • 预引导加载屏幕

    我正在寻找一个预引导加载屏幕 类似于这个例子但对于 Angular 2 来说 我可以建议一种简单的 CSS 方法 首先添加 loadingdiv 到主 HTML 页面中 它应该遵循主应用程序组件元素 例如
  • JavaScript 拖放

    我正在寻找有人解释如何在 javascript 中拖放 我想要一条水平线 其中包含一些可自定义的图像 我看过这些的在线教程 但发现它们很难使用 我建议您研究一下 Javascript 框架之一 我们用原型与剧本 您可以在 Scriptacu
  • 如何在android中加载BufferedImage?

    我要加载BufferedImage在我的应用程序中 为此我正在使用ImageIO但我越来越java lang NoClassDefFoundError BufferedImage tgtImg loadImage ImageD2 jpg p
  • Google Apps 脚本仅在一次迭代后就停止了

    我在谷歌应用程序脚本中有一个小函数 必须在 for 循环中执行一些操作 即我有 3 行 其中包含一些值 对于每一行 我必须更新一张表 但不幸的是 我不明白为什么 但在仅仅一个之后循环程序停止了 并且没有return声明 这是代码 funct