如何使用 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 的结构应该完全相同。
我只想问一下如何通过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 的结构应该完全相同。