【问题标题】:Use Google Apps Script to loop through the whole column使用 Google Apps 脚本循环遍历整个列
【发布时间】:2017-03-06 18:09:20
【问题描述】:

我正在尝试遍历我的谷歌表中的整行并将一些数据从一张表复制到另一张表。该列表会随着时间的推移而变得更长。

更具体地说:如果 B 列中的输入等于“蓝色”,则将 A 列和 C 列中的值复制到另一张表中。 对所有列执行此操作,直到列结束。

链接到我的电子表格:https://docs.google.com/spreadsheets/d/1xnLygpuJnpDfnF6LdR41gN74gWy8mxhVnQJ7i3hv1NA/edit?usp=sharing

  • 当颜色不等于蓝色时,循环停止。为什么?
  • 如您所见,我使用了 for 循环。这就是要走的路吗?
  • 我可以对代码执行速度做些什么吗?

非常感谢任何 cmets、提示或帮助。

问候!

【问题讨论】:

    标签: javascript loops google-apps-script google-sheets


    【解决方案1】:

    您有一个名为“List”的输入表,而我将输出表命名为“Output”。这是代码。

    function condCopy()
    {
      var s = SpreadsheetApp.getActiveSpreadsheet();
      var sht = s.getSheetByName('List')
      var drng = sht.getDataRange();
      var rng = sht.getRange(2,1, drng.getLastRow()-1,drng.getLastColumn());
      var rngA = rng.getValues();//Array of input values
      var rngB = [];//Array where values that past the condition will go
      var b = 0;//Output iterator
      for(var i = 0; i < rngA.length; i++)
      {
        if(rngA[i][1] == 'blue')
        {
          rngB[b]=[];//Initial new array
          rngB[b].push(rngA[i][0],rngA[i][2]);
          b++;
        }
      }
      var shtout = s.getSheetByName('Output');
      var outrng = shtout.getRange(2,1,rngB.length,2);//Make the output range the same size as the output array
      outrng.setValues(rngB);
    }
    

    【讨论】:

      【解决方案2】:

      您有 2 个选项。第一种是使用 Google 表格中的标准 query() 函数来获取值。这里的缺点是它只是值的参考。所以你不能对它们重新排序,等等。要使用它,将它放在单元格 A1 中,它将拉出标题并从列 A 和 C 中检索值:

      =QUERY(A:C, "select A, C where B = 'blue'", 1)
      

      对于 Google Apps 脚本答案: 这将遍历您的列表工作表,并且对于 B 列为 蓝色 的每一行,它会将 A 列和 C 列中的值保存到新工作表的 A 列和 B 列:

      function doIt(){
        var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet4");
        var lastRow = activeSheet.getLastRow();
        var lastCol = activeSheet.getLastColumn();
        var targetValues = [];
      
        var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("List");
        var lastSourceRow = sourceSheet.getLastRow();
        var lastSourceCol = sourceSheet.getLastColumn();
      
        var sourceRange = sourceSheet.getRange(1, 1, lastSourceRow, lastSourceCol);
        var sourceData = sourceRange.getValues();
      
        var activeRow = 0;
      
        //Loop through every retrieved row from the Source
        for (row in sourceData) {
          //IF Column B in this row has 'blue', then work on it.
          if (sourceData[row][1] === 'blue') {
            //Save it ta a temporary variable
            var tempvalue = [sourceData[row][0], sourceData[row][2]];
            //then push that into the variables which holds all the new values to be returned
            targetValues.push(tempvalue);
          }
        }
      
        //Save the new range to the appropriate sheet starting at the last empty row
        activeSheet.getRange(lastRow + 1, 1 , targetValues.length, 2).setValues(targetValues);
      }
      

      当然,您可以通过替换 2 行来将要测试的值传递给函数。首先,定义函数:

      function doIt(testingvar){
      

      传递一个名为 testingvar 的变量,以及用传递的变量替换硬编码测试的测试行:

      if (sourceData[row][1] === testingvar) {
      

      【讨论】:

      • 这是一个很好的代码。但是你能告诉我如果我们想在添加到第二张表后删除该行该怎么办。
      • @xitas 看看这个帖子:stackoverflow.com/questions/37924842/… 您应该将要删除的行保存在一个数组中,然后从下往上删除它们。此外,如果您有连续的行,请将它们作为一个组删除。每次删除一行的调用都会减慢代码的速度,因此最小化调用很重要。请注意,当您删除一行时,它会重新编号行。这就是为什么你从底部开始,然后一路向上。
      • 那是怎么回事,非常感谢您的回复。
      猜你喜欢
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多