【问题标题】:Google Appscript For Loop runs only once when a function is calledGoogle Appscript For Loop 仅在调用函数时运行一次
【发布时间】:2021-07-10 00:38:49
【问题描述】:

我希望你比平时更花哨。

我在这个问题上停留了几天,我不知道我在哪里犯了错误。基本上,我想从一张表中复制一列(我们称之为 DailyOrders),进行一些更改并将其粘贴到同一工作簿中另一张表的列中。

它应该是这样的:

1:DailyOrders 列 M

2:将二维数组复制到临时变量

3:将这些数组元素转换为字符串并一个一个地进行处理,并继续将它们推送到另一个二维数组中

4:将新的二维数组推送到“排序”表中的 A 列。

问题:

当我将 Logger.Log 语句用于测试时,应该遍历原始数组并将这些元素推送到 pusher 函数中的 for 循环运行正确的时间,但在我调用 pusher 函数时只运行一次。我不知道为什么会这样。

function sort(){
var values = SpreadsheetApp.getActiveSheet().getRange("DailyOrders!M2:M4").getValues();
var newvalues = [];
for(i=0;i<values.length;i++){
  pusher(values[i]);
  Logger.log(i);
}

function pusher(item) {
  item = item.toString();
  item = item.split("|| ");
   for(i=0; i<item.length; i++){
    newvalues.push([item[i]]);        
  }
//push newvalues[] to "sort!A:A"}

这是我关于堆栈溢出的第一个问题,如果您需要任何进一步的解释,请告诉我。

重新生成问题的示例工作表:

https://docs.google.com/spreadsheets/d/1709A3kLPQ5eVCL_bQcRSc0U33hdIz9_3juouqesHYZM/edit?usp=sharing

【问题讨论】:

    标签: javascript arrays for-loop google-apps-script google-sheets


    【解决方案1】:

    我相信你的目标如下。

    • 您希望将“DailyOrders”表的“M”列中的值检索到数组中。
    • 当单元格值有||时,要拆分值,将拆分后的值放入数组中。
    • 您希望将创建的数组放入“排序”表的“A”列。

    修改点:

    • getValues检索到的值是二维数组。
    • 在您的脚本中,newvalues 未在 sort 中使用。因此,pusher() 中不使用它。
    • 当使用getDisplayValues 而不是getValues 时,检索的值是字符串类型。 getDisplayValues检索到的值也是二维数组。

    当以上几点反映到你的脚本中时,它变成如下。

    修改脚本:

    function sort() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var values = ss.getSheetByName("DailyOrders").getRange("M2:M").getDisplayValues();
      var newvalues = [];
      for (i = 0; i < values.length; i++) {
        var item = values[i][0];
        var items = item.split("||");
        if (items.length > 1) {
          for (var j = 0; j < items.length; j++) {
            newvalues.push([items[j].trim()]);
          }
        } else if (item) {
          newvalues.push([item]);
        }
      }
      var dstSheet = ss.getSheetByName("sort");
      dstSheet.getRange(dstSheet.getLastRow() + 1, 1, newvalues.length, 1).setValues(newvalues);
    }
    

    参考资料:

    补充:

    根据您的以下回复,

    感谢您的快速回复,但您的回答并未解决我面临的问题,并且您建议的代码修改似乎不起作用。变量项 = 值[i][0];返回 M2 的第一个字符,M3 的第二个字符,M4 的第三个字符,依此类推。我将值作为数组或字符串获取没有问题,我只是想调试为什么当我在其中调用一个函数时 for 循环只运行一次。

    在您的脚本中,变量 i 用于 2 个 for 循环。这样,i 总是被初始化。而且,在你的情况下,i 总是小于values.length。至此,循环并未结束。我认为这是您的问题的原因。如果您想修改您的脚本,请按如下方式修改您的脚本。

    发件人:

     for(i=0; i<item.length; i++){
      newvalues.push([item[i]]);        
    }
    

    收件人:

    for (var j = 0; j < item.length; j++) {
      newvalues.push([item[j]]);
    }
    

    【讨论】:

    • 感谢您的快速回复,但您的回答并未解决我面临的问题,并且您建议的代码修改似乎不起作用。变量项 = 值[i][0];返回 M2 的第一个字符,M3 的第二个字符,M4 的第三个字符,依此类推。我将值作为数组或字符串获取没有问题,我只想调试为什么当我在其中调用一个函数时 for 循环只运行一次。
    • @Usmantastic 感谢您的回复。我带来的不便表示歉意。我必须为我糟糕的英语水平道歉。关于I just want to debug why the for loop only runs once when I call a function inside it.,在您的脚本中,变量i 用于2 个for 循环。这样,i 总是被初始化。而且,在您的情况下,i 总是小于values.length。至此,循环并未结束。我认为这是你的问题的原因。如果你想修改你的脚本,请查看我更新的答案。
    【解决方案2】:

    回答

    如果数组item 只有一个元素,则函数pusher 内的循环只运行一次。此外,您必须将i 更改为j 以避免弄乱索引。将pusher 函数应用于DailyOrders 的所有元素后,您可以使用sort 对结果数组进行排序。下面是修改后的代码:

    代码

    function sort() {
      var values = SpreadsheetApp.getActiveSheet().getRange("DailyOrders!M1:M10").getValues();
      var newvalues = []
      for (i = 0; i < values.length; i++) {
        pusher(values[i])
      }
    
      function pusher(item) {
        item = item.toString()
        item = item.split("|| ")
        for (j = 0; j < item.length; j++) {
          newvalues.push([item[j]]);
        }
      }
    
      newvalues.sort()  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多