简体   繁体   English

Google表格:将文件夹范围导入母版表格

[英]Google Sheets: Import folder range into Master Sheet

I'm looking to import rows from spreadsheets in a source folder that will be updated daily with new spreadsheets. 我希望从源文件夹中的电子表格中导入行,该文件夹每天都会使用新的电子表格进行更新。 Is it possible to pull a specific range from every new spreadsheet in the source folder into a Master Sheet? 是否可以将源文件夹中每个新电子表格中的特定范围拉入母版表?

I've been using the following code from an answer to a similar question here. 我一直在使用以下代码从这里回答类似的问题。 This works perfectly except it duplicates the data that has already been imported to the Master Sheet. 除了复制已经导入到母版表中的数据之外,这非常完美。 How can I fix this? 我怎样才能解决这个问题?

function getdata() {
  //declare multiple variables in one statement - Initial value will
  //be undefined
  var destinationSpreadsheet,destinationSS_ID,destsheet,destrange,file,files,
      sourcerange,sourceSS,sourcesheet,srcSheetName,sourcevalues;

  srcSheetName = "Type the Name of Source Sheet Tab Here";
  destinationSS_ID = "Type the Name of destination spreadsheet file ID Here";
  files = DriveApp.getFolderById("Folder ID").getFiles();
  destinationSpreadsheet = SpreadsheetApp.openById(destinationSS_ID);
  destsheet = destinationSpreadsheet.getSheetByName('Sheet1');  

  while (files.hasNext()) {
    file = files.next();
    if (file.getMimeType() !== "application/vnd.google-apps.spreadsheet") {
      continue;
    };
    sourceSS = SpreadsheetApp.openById(file.getId());
    sourcesheet = sourceSS.getSheetByName(srcSheetName);
    //sourcesheet.getRange(start row, start column, numRows, number of Columns)
    sourcerange = sourcesheet.getRange(2,1,sourcesheet.getLastRow()-1,6);
    sourcevalues = sourcerange.getValues();

    //Write all the new data to the end of this data
    destrange = destinationSpreadsheet.getSheetByName("Sheet1")
        .getRange(destsheet.getLastRow()+1,1,sourcevalues.length,sourcevalues[0].length);

    destrange.setValues(sourcevalues);         
  };
};
  • You want to put the values of "Sheet1" of "Data File - TEST#" Spreadsheets to "Sheet1" of the "MASTER" Spreadsheet. 您想要将“数据文件-TEST#”电子表格的“ Sheet1”的值放入“ MASTER”电子表格的“ Sheet1”。
  • You don't want to put the values of "Data File - TEST#", when the values of "Data File - TEST#" are existing in "MASTER". 当“ MASTER”中存在“数据文件-TEST#”的值时,您不想放置“数据文件-TEST#”的值。

If my understanding is correct, how about this modification? 如果我的理解是正确的,那么该修改如何? The flow of modified script is as follows. 修改后的脚本流程如下。 Please think of this as just one of several answers. 请认为这只是几个答案之一。

  1. Retrieve values from "Sheet1" of the "MASTER" Spreadsheet. 从“ MASTER”电子表格的“ Sheet1”中检索值。
  2. Retrieve values from "Sheet1" of "Data File - TEST#" Spreadsheets. 从“数据文件-TEST#”电子表格的“ Sheet1”中检索值。
  3. Compare both values. 比较两个值。 When there are NOT the same values of rows in both sheets, the values are put from "Data File - TEST#" to "MASTER". 如果两张纸中的行值都不相同,则将值从“数据文件-TEST#”放到“主”中。

Modified script: 修改后的脚本:

function getdata() {
  var masterSpreadsheetId = "###"; // Spreadsheet ID of "MASTER" spreadsheet.
  var folderId = "###"; // Folder ID including "Data File" files.
  var dataFileSheetName = "Sheet1";

  var files = DriveApp.getFolderById(folderId).getFiles();
  var masterSpreadsheet = SpreadsheetApp.openById(masterSpreadsheetId);
  var destSheet = masterSpreadsheet.getSheetByName('Sheet1');
  var destSheetValues = destSheet.getRange(2, 1, destSheet.getLastRow() - 1, 6).getValues();
  var values = [];
  while (files.hasNext()) {
    var file = files.next();
    if (file.getMimeType() !== "application/vnd.google-apps.spreadsheet") continue;
    var dataFileSS = SpreadsheetApp.openById(file.getId());
    var dataFileSheet = dataFileSS.getSheetByName(dataFileSheetName);
    var dataFileValues = dataFileSheet.getRange(2, 1, dataFileSheet.getLastRow()-1, 6).getValues();
    Array.prototype.push.apply(values, dataFileValues);
  };
  var res = values.filter(function(e) {
    return !destSheetValues.some(function(f) {
      return e.every(function(g, k) {
        var temp = f[k];
        if (k < 2) {
          g = new Date(g).getTime();
          temp = new Date(temp).getTime();
        }
        return g == temp;
      });
    });
  });
  if (res.length > 0) destSheet.getRange(destSheet.getLastRow()+1,1,res.length,res[0].length).setValues(res);
}

Note: 注意:

  • In this sample script, your shared sample Spreadsheet of "MASTER", "Data File - TESTA", "Data File - TESTB" and "Data File - TESTC" were used. 在此示例脚本中,使用了“ MASTER”,“ Data File-TESTA”,“ Data File-TESTB”和“ Data File-TESTC”的共享示例电子表格。 So if your actual situation uses the different names of Spreadsheet file names and sheet names, please modify them. 因此,如果您的实际情况使用电子表格文件名和工作表名的不同名称,请对其进行修改。

References: 参考文献:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM