【问题标题】:Google Apps Script to Iterate through a list of Spreadsheet ID's and copy range to a master file用于遍历电子表格 ID 列表并将范围复制到主文件的 Google Apps 脚本
【发布时间】:2016-04-23 08:55:00
【问题描述】:

我的驱动器中有一个文件夹,我在其中为每个新客户创建一个文件夹(基于模板结构)。我需要从一个文件中提取信息,特别是从它们的每个文件夹中提取信息。我在列表中有电子表格 ID,而且我知道工作表名称,但我不确定如何创建一个循环来遍历每个文件并将其附加到主文件。

我最近发现了一个脚本here 可以解决问题,但它假定所有电子表格都在一个文件夹中:

function getDataToMaster2() {
    var comp = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("System_Control").getRange("d7").getValue();
  var folder = DriveApp.getFolderById(comp); //Define id of folder
  var contents = folder.getFiles();
  var file; 
  var data;
  var sheetMaster = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form_Responses"); //first sheet of the file, change by getSheetByName("NAME") if you want
  while(contents.hasNext()){  
    file = contents.next();
    if (file.getMimeType() == "application/vnd.google-apps.spreadsheet") {
      var sheet = SpreadsheetApp.openById(file.getId()).getSheetByName("Form_Responses");//first sheet of the file, change by getSheetByName("NAME") if you want
      var startRow = 2; 
      var data = sheet.getDataRange().getValues();
      var colToCheck = 14;
      for(var j = 1; j < data.length;j++){
        if(data[j][colToCheck-1] != "copied"){
          sheetMaster.appendRow(data[j]);
          sheet.getRange((j+1), colToCheck).setValue("copied");
          SpreadsheetApp.flush();
        }
      }
    } 
  }
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    这是一个循环遍历 idList 的函数,idList 是一个包含要复制的每个电子表格的 Id 的数组。它从每个“Sheet1”中获取所有数据,并复制到活动电子表格中的“Master”表。

    数据复制立即发生,而不像您的示例那样循环遍历行;一次移动更大的块更有效。

    function getDataToMaster2() {
      var idList = ['id1', 'id2', 'id3'];
      var sheetMaster = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Master");
      for (var i = 0; i < idList.length; i++) {  
        var sheet = SpreadsheetApp.openById(idList[i]).getSheetByName("Sheet1"); 
        var data = sheet.getDataRange().getValues();
        var lastRow = sheetMaster.getLastRow();
        sheetMaster.insertRowsAfter(lastRow, data.length);
        sheetMaster.getRange(lastRow + 1, 1, data.length, data[0].length).setValues(data);
      }
    }
    

    如果 id 存储在工作表“Ids”的 B 列中,那么函数的开头将不同:

      var sheetIds = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Ids");
      var values = sheetIds.getRange('B:B').getValues();
      var idList = values.map(function (row) {
        return row[0];
      }).filter(function (id) {
        return id;
      });
    

    然后像上面那样继续 for 循环。

    【讨论】:

    • 完美!只是一个小问题 - 如果 id 在一列中,并且不断添加更多,我将如何制作数组?
    • 我将此添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2021-09-18
    相关资源
    最近更新 更多