【问题标题】:Concatenate large dataset from multiple worksheets of a Google Sheet连接来自 Google Sheet 的多个工作表的大型数据集
【发布时间】:2018-04-09 15:48:28
【问题描述】:

我正在使用下面的代码将文件中的某些工作表连接到一个名为“Master”的工作表中。

  1. 目前,我的脚本复制了标题行,但我想防止这种情况发生。所有工作表中的数据格式完全相同,标题相同。
  2. 每张工作表有 58 列,其中一张有 5000 行。
  3. 理想情况下,我希望脚本在每次运行脚本时覆盖“主”工作表。

如何修改我的脚本以实现这些目标?

function concatAllSheets()
{
  var includedSheet = ['Virtue data - Norway - NOK', 'Virtue data - Sweden - SKK', 'Virtue data - Denmark - DKK', 'Virtue Data - GBP', 'Virtue data - EUR markets', 'Virtue data - Arabia - USD'];
  var ss = SpreadsheetApp.getActive();
  var allSheets = ss.getSheets();
  var sheetName = 'Master'
  var mother = ss.insertSheet(sheetName);
  for(var i = 0; i < allSheets.length; i++)
  {
    var sht = allSheets[i];
    if(includedSheet.indexOf(sht.getName()) > -1)
    {
      var rng = sht.getDataRange();
      var rngA = rng.getValues();
      for(var j = 0; j < rngA.length; j++)
      {
        var row = rngA[j];
        mother.appendRow(row);
      }
    }
  }
}

【问题讨论】:

    标签: google-apps-script google-sheets concatenation


    【解决方案1】:

    不要为每一行数据调用appendRow(),这会真正减慢您的脚本速度,而是使用batch operation,如setValues()

    为此,请创建一个allData 数组来保存“主”工作表的内容。当您遍历工作表时,将其数据附加到allData,最后将其打印到工作表上。

    当您进行迭代时,您可以对allData 的长度进行简单检查,以查看标题行是否已经存在。如果allData 为空,那么显然没有标题行。

    function concatAllSheets()
    {
      var includedSheet=['Virtue data - Norway - NOK','Virtue data - Sweden - SKK','Virtue data - Denmark - DKK','Virtue Data - GBP','Virtue data - EUR markets','Virtue data - Arabia - USD'];
      var ss=SpreadsheetApp.getActive();
      var allSheets=ss.getSheets();
      var sheetName='Master'
      var mother=ss.insertSheet(sheetName);
      var allData = [];
      for(var i=0;i<allSheets.length;i++)
      {
        var sht=allSheets[i];
        if(includedSheet.indexOf(sht.getName())>-1)
        {
          var rng=sht.getDataRange();
          var rngA=rng.getValues();
          if (allData.length == 0) // This will only ever be true on the first sheet copied
          {
            allData = rngA;
          } else {
            rngA.shift(); // Remove the first row
            allData = allData.concat(rngA);
          }
        }
      }
      mother.getRange(1, 1, allData.length, allData[0].length).setValues(allData); // Use a batch operation to insert the data
    }
    

    【讨论】:

    • 谢谢 - 但我将如何保留第一行的第一行?这样我就可以维护标题行。
    • 如果它已经存在,我可以设置脚本覆盖主表中的现有数据吗?所以脚本可以开始从 row2 粘贴数据,因为我已经在这个文件中有标题行
    • 我也得到了错误 - “超过最大执行时间”
    • @Nij 试试这个版本,看看你的最大执行时间错误是否仍然存在。
    • 似乎有效 - 如果我有问题会检查并通知您 - 谢谢!
    【解决方案2】:

    鉴于数据集的大小,您需要使用批处理方法Range#getValuesRange#setValues 来最小化读取和写入。您还可以通过使用Array#forEach 仅绑定名称数组中的表单来避免遍历不必要的表单。此模式还确保您收集您想要的所有数据 - 如果您的名称数组中有错字,或者工作表的名称被无意更改,这将引发异常,而不是默默地不包括数据。

    function concatenateSheets() {
      var sheetNames = ["name1", "name2", ...];
      var ss = SpreadsheetApp.getActive();
      var dest = ss.getSheetByName("someName");
      var output = [], header = [];
      // Assemble a single paste output from all the sheets.
      sheetNames.forEach(function (name) {
        var sheet = ss.getSheetByName(name);
        if(!sheet)
          throw new Error("Incorrect sheet name '" + name + "'");
        var vals = sheet.getDataRange().getValues();
        // Remove the header row. 
        header = vals.splice(0, 1);
        // Append to existing output array.
        output = [].concat(output, vals);
      });
      // Serialize output data array.
      if(dest && output.length && output[0].length) {
        // Remove all existing data values on the destination sheet.
        // (Only necessary if the number of rows or columns can decrease.)
        dest.getDataRange().clearContent();
    
        // Prepend the header on the output data array.
        output.unshift(header);
    
        dest.getRange(1, 1, output.length, output[0].length).setValues(output);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多