如何使用 ID 和 Google App Script 将多个 spreadsheet 组合成一个 sheet

How to combine multiple spreadsheet into one sheet using ID with Google App Script

我只想问一下如何通过ID将来自多个spreadsheet的数据合并为一个sheet。因此,我在 Master spreadsheet 中制作了 2 sheets(1 个用于 Data Master,1 个用于 ID 列表)。我想从 ID 列表 Sheet 中获取 ID 以获取文件和我想合并的 sheet。我已经使用 DriveApp.getFileById 但它仍然无法正常工作。我当前的脚本仅使用文件名列表来访问 sheet2 上的数据,但仍然无法正常工作。您有任何解决方案来更改或修复我的脚本吗?这将非常有帮助。谢谢!

注意:Source spreadsheet的数据可以随时更新

这是我当前的脚本(灵感来自 https://codewithcurt.com/combine-multiple-spreadsheets-into-one-google-sheet/):

function myFunction() {
  var sheetIDurl = 'xxxxxxxx';
  
  var source = SpreadsheetApp.openByUrl(sheetIDurl).getSheetByName('ID').getDataRange().getValues();
  
  var folder = DriveApp.getFolderById('xxxxxxxxxx');
  
  var ssa = SpreadsheetApp.getActiveSpreadsheet();
  
  var copySheet = ssa.getSheetByName('Master');
  copySheet.getRange('A2:Z').clear();
  var search = [];
  for (var i = 1; i < source.length; i++) {
    
    search = source[i][0].toString();

    var file = folder.getFilesByName(search);

    while (file.hasNext()) {
      var getFile = file.next();
      break;
    }
    Logger.log(getFile);
    var ss = SpreadsheetApp.open(getFile);
    SpreadsheetApp.setActiveSpreadsheet(ss);
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2');

    for (var i = 0; i < sheets.length; i++) {
      var nameSheet = ss.getSheetByName(sheets[i].getName());
      var nameRange = nameSheet.getDataRange();
      var nameValues = nameRange.getValues();

      for (var y = 1; y < nameValues.length; y++) {
        copySheet.appendRow(nameValues[y]);
      }
    }
  }
}

更改 sheet 名称后尝试下面的示例脚本:-

function data_Merger()
{
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const mergeSheet = ss.getSheetByName('Master Sheet Name, where data should be pasted'); //Change sheet name
  const id_Sheet = ss.getSheetByName('ID SheetName'); //Change sheet name
  const IDs = id_Sheet.getRange('A2:A').getValues().flat() // Change to your column range which contains IDs
  var mergedData = []
  for(var i = 0 ; i < IDs.length ; i++)
  { 
       var ns = SpreadsheetApp.openById(IDs[i]).getSheetByName('Sheet2')
       var MRange = ns.getRange(2, 1, ns.getLastRow()-1, ns.getLastColumn()).getValues()   // Excluding Header Row
       for(var j = 0 ; j < MRange.length ; j++)
       {
         mergedData.push(MRange[j])
       }     
  }
  
  mergeSheet.getRange(2, 1, mergedData.length, mergedData[0].length).setValues(mergedData) // Pasting data in Master Sheet  
}
  • 所有 sheet 的结构应该完全相同。