【问题标题】:Copying all the sheets in every workbook within a google drive folder复制谷歌驱动器文件夹中每个工作簿中的所有工作表
【发布时间】:2019-08-12 23:07:58
【问题描述】:

我想要一个 google 脚本,它将遍历我的 google drive 文件夹中的每个工作簿(电子表格),然后将其中的每张表复制到我自己的一张表中。我已经有一个脚本,但它设置为只复制第一张工作表,我们可以让它循环复制电子表格中的所有工作表

我尝试更改索引,但它只会拉一张纸

function getDataToMaster() {
  var folder = DriveApp.getFolderById("******************"); //Define id of folder
  var contents = folder.getFiles();
  var file; 
  var data;
  var sheetMaster = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; //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()).getSheets()[0];//first sheet of the file, change by getSheetByName("NAME") if you want
      var startRow = 1; 
      var data = sheet.getDataRange().getValues();
      var colToCheck = 7;
      for(var j = 0; j < data.length;j++){
        if(data[j][colToCheck-1] != "copied"){
          sheetMaster.appendRow(data[j]);
          sheet.getRange((j+1), colToCheck).setValue("copied");
          SpreadsheetApp.flush();
        }
      }
    } 
  }
}

【问题讨论】:

    标签: javascript google-apps-script


    【解决方案1】:

    Spreadsheet.getSheets() 返回一个可以迭代的表格数组。

    建议:当您知道您将遍历数组中的每个元素时(即您不想通过break 或return 提前退出以终止循环),然后尝试Array.prototype.forEach,因为它减少了您需要设置的变量数量。以下是我将如何使用 forEach 重写您的 getDataToMaster 函数两次:

    function getDataToMaster() { 
      var folder = DriveApp.getFolderById("******************");
      var contents = folder.getFiles();
      var sheetMaster = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
      while (contents.hasNext()) {    
        var file = contents.next();
        if (file.getMimeType() !== "application/vnd.google-apps.spreadsheet") { 
         continue;
        } 
        SpreadsheetApp.openById(file.getId()).getSheets()
          .forEach(function (sheet) { 
            var colToCheck = 7;
            sheet.getDataRange().getValues()
              .forEach(function (row, index) { 
                if (row[colToCheck - 1] != "copied") { 
                  sheetMaster.appendRow(row);
                  sheet.getRange(index + 1, colToCheck).setValue("copied");
                  SpreadsheetApp.flush();
                } 
              });
          });
      } 
    }
    

    【讨论】:

      【解决方案2】:

      如果你像这样在if 语句下面添加一个for 循环,它应该可以工作

          if (file.getMimeType() == "application/vnd.google-apps.spreadsheet") {
            var sheetCount = SpreadsheetApp.openById(file.getId()).getNumSheets();
            for(var k = 0; k < sheetCount; k++){
              var sheet = SpreadsheetApp.openById(file.getId()).getSheets()[k];//iterates through each sheet in the file
              var startRow = 1; 
              var data = sheet.getDataRange().getValues();
              var colToCheck = 7;
              for(var j = 0; j < data.length;j++){
                if(data[j][colToCheck-1] != "copied"){
                  sheetMaster.appendRow(data[j]);
                  sheet.getRange((j+1), colToCheck).setValue("copied");
                  SpreadsheetApp.flush();
                }
              }
            }
          }
      

      getSheets()[Integer] 的工作原理是它获取具有所提供的匹配索引号的工作表。电子表格中的第一个工作表是索引 0,第二个是 1,第三个是 2,依此类推。这个循环只是获取有多少工作表,并遍历执行您为每个工作表编写的操作的索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-09
        相关资源
        最近更新 更多