【问题标题】:Google Sheets: Import folder range into Master SheetGoogle 表格:将文件夹范围导入主表格
【发布时间】:2019-05-15 08:22:09
【问题描述】:

我希望从源文件夹中的电子表格中导入行,该文件夹将使用新的电子表格每天更新。是否可以将源文件夹中每个新电子表格中的特定范围提取到主工作表中?

我一直在使用来自此处类似问题的答案的以下代码。除了复制已导入主表的数据外,这非常有效。我该如何解决这个问题?

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);         
  };
};

【问题讨论】:

  • 为了正确理解你的问题,能否提供你想要的输入输出样本?
  • 我创建了一个示例,该示例具有从“数据文件”文件夹中的 google 工作表导入数据的主工作表。主表和数据文件表具有相同的列标题和表名称。在示例中,我已将上述脚本运行了 3 次。它可以工作,但是,我希望它避免导入已经导入的数据。 link
  • 感谢您回复并提供示例电子表格。从他们那里,我提出了一个修改后的脚本。你能确认一下吗?如果我误解了您的问题并且这不是您想要的结果,我深表歉意。
  • 感谢 Tanaike,这正是我想做的。完美运行!
  • 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。

标签: google-apps-script google-sheets import google-sheets-api


【解决方案1】:
  • 您想将“Data File - TEST#”电子表格的“Sheet1”的值放入“MASTER”电子表格的“Sheet1”。
  • 当“数据文件 - TEST#”的值存在于“MASTER”中时,您不想放置“数据文件 - TEST#”的值。

如果我的理解是正确的,那么这个修改呢?修改脚本的流程如下。请认为这只是几个答案之一。

  1. 从“MASTER”电子表格的“Sheet1”中检索值。
  2. 从“数据文件 - TEST#”电子表格的“Sheet1”中检索值。
  3. 比较两个值。当两个工作表中的行值不同时,会将这些值从“数据文件 - TEST#”放入“MASTER”。

修改脚本:

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);
}

注意:

  • 在此示例脚本中,使用了您的共享示例电子表格“MASTER”、“数据文件 - TESTA”、“数据文件 - TESTB”和“数据文件 - TESTC”。所以如果你的实际情况使用了Spreadsheet文件名和sheet名不同的名字,请自行修改。

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多