Google 工作表,来自多个工作簿的堆栈报告
Google Sheets, stack report from multiple workbooks
目标:将来自 90 多个 google 工作簿的数据,全部具有相同的 sheet 名称,堆叠到一个主 sheet 中用于报告
信息:
所有作品sheet 都有相同的列数。
我有以下脚本,但它没有 运行 正确,我认为问题在于我如何在粘贴到输出 sheet.
之前缓存/将数据推送到数组
我正在尝试构建一个数组然后一次性粘贴它。
我堆叠的表格有 47 列,行数未知。
打开 sheets 的部分工作正常。
// Get the data from the worksheets
var indexsheet = SpreadsheetApp.getActive().getSheetByName("Index");
var outputsheet = SpreadsheetApp.getActive().getSheetByName("Output");
var response = SpreadsheetApp.getUi().prompt('Current Cycle', 'Enter Cycle Name Exactly in YY-MMM-Cycle# format', SpreadsheetApp.getUi().ButtonSet.OK_CANCEL)
var CurrentCycleName = response.getResponseText()
// Assign datasets to variables
var indexdata = indexsheet.getDataRange().getValues();
// For each workbook in the index sheet, open it and copy the data to a cache
indexdata.forEach(function(row, r) {
try {
//open Entity specific workbook
var workbookid = indexsheet.getRange(r + 1, 7, 1, 1).getValues();
var Entityworkbook = SpreadsheetApp.openById(workbookid)
// Open workhseet
Entitysheet.getSheetByName(CurrentCycleName)
// Add PR Data to cache - stacking for all countrys
var PRDataCache = Entitysheet.getDataRange().push()
} catch {}
})
// Set the all values of the sheet at once
outputsheet.getRange(r + 1, 14).setValue('Issue Splitting Data')
Entitysheet.getRange(2, 1, PRDataCache.length || 1, 47).setValues(PRDataCache)
};
这是我们从中获取工作簿 ID 以打开每个文件的索引选项卡
这是输出文件,我们正在堆叠每个国家/地区的所有数据
我相信你的目标如下。
- 您想从“索引”的“G”列中检索 Spreadsheet ID sheet。
- 您想使用对话框给出特定的 sheet 名称。
- 您想从所有 Spreadsheet 中的规范 sheet 中检索所有值。在这种情况下,您要删除 header 行。
- 您想将检索到的值放在“输出”上 sheet。
在这种情况下,下面的示例脚本怎么样?
示例脚本:
function myFunction() {
var ss = SpreadsheetApp.getActive();
var indexsheet = ss.getSheetByName("Index");
var outputsheet = ss.getSheetByName("Output");
var response = SpreadsheetApp.getUi().prompt('Current Cycle', 'Enter Cycle Name Exactly in YY-MMM-Cycle# format', SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
var CurrentCycleName = response.getResponseText();
var ids = indexsheet.getRange("G1:G" + indexsheet.getLastRow()).getValues();
var values = ids.reduce((ar, [id]) => {
try {
var [, ...values] = SpreadsheetApp.openById(id).getSheetByName(CurrentCycleName).getDataRange().getValues();
ar = [...ar, ...values];
} catch (e) {
console.log(`"${id}" was not found.`);
}
return ar;
}, []);
if (values.length == 0) return;
// If the number of columns is different in all Spreadsheets, please use the following script.
// var maxLen = Math.max(...values.map(r => r.length));
// values = values.map(r => r.length < maxLen ? [...r, ...Array(maxLen - r.length).fill("")] : r);
outputsheet.getRange(outputsheet.getLastRow() + 1, 1, values.length, values[1].length).setValues(values);
}
注:
- 当Spreadsheet ID数量较多时,处理时间可能超过6分钟。我很担心这个。到时候把Spreadsheet ID分开怎么样?
参考:
目标:将来自 90 多个 google 工作簿的数据,全部具有相同的 sheet 名称,堆叠到一个主 sheet 中用于报告
信息: 所有作品sheet 都有相同的列数。 我有以下脚本,但它没有 运行 正确,我认为问题在于我如何在粘贴到输出 sheet.
之前缓存/将数据推送到数组我正在尝试构建一个数组然后一次性粘贴它。
我堆叠的表格有 47 列,行数未知。 打开 sheets 的部分工作正常。
// Get the data from the worksheets
var indexsheet = SpreadsheetApp.getActive().getSheetByName("Index");
var outputsheet = SpreadsheetApp.getActive().getSheetByName("Output");
var response = SpreadsheetApp.getUi().prompt('Current Cycle', 'Enter Cycle Name Exactly in YY-MMM-Cycle# format', SpreadsheetApp.getUi().ButtonSet.OK_CANCEL)
var CurrentCycleName = response.getResponseText()
// Assign datasets to variables
var indexdata = indexsheet.getDataRange().getValues();
// For each workbook in the index sheet, open it and copy the data to a cache
indexdata.forEach(function(row, r) {
try {
//open Entity specific workbook
var workbookid = indexsheet.getRange(r + 1, 7, 1, 1).getValues();
var Entityworkbook = SpreadsheetApp.openById(workbookid)
// Open workhseet
Entitysheet.getSheetByName(CurrentCycleName)
// Add PR Data to cache - stacking for all countrys
var PRDataCache = Entitysheet.getDataRange().push()
} catch {}
})
// Set the all values of the sheet at once
outputsheet.getRange(r + 1, 14).setValue('Issue Splitting Data')
Entitysheet.getRange(2, 1, PRDataCache.length || 1, 47).setValues(PRDataCache)
};
我相信你的目标如下。
- 您想从“索引”的“G”列中检索 Spreadsheet ID sheet。
- 您想使用对话框给出特定的 sheet 名称。
- 您想从所有 Spreadsheet 中的规范 sheet 中检索所有值。在这种情况下,您要删除 header 行。
- 您想将检索到的值放在“输出”上 sheet。
在这种情况下,下面的示例脚本怎么样?
示例脚本:
function myFunction() {
var ss = SpreadsheetApp.getActive();
var indexsheet = ss.getSheetByName("Index");
var outputsheet = ss.getSheetByName("Output");
var response = SpreadsheetApp.getUi().prompt('Current Cycle', 'Enter Cycle Name Exactly in YY-MMM-Cycle# format', SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
var CurrentCycleName = response.getResponseText();
var ids = indexsheet.getRange("G1:G" + indexsheet.getLastRow()).getValues();
var values = ids.reduce((ar, [id]) => {
try {
var [, ...values] = SpreadsheetApp.openById(id).getSheetByName(CurrentCycleName).getDataRange().getValues();
ar = [...ar, ...values];
} catch (e) {
console.log(`"${id}" was not found.`);
}
return ar;
}, []);
if (values.length == 0) return;
// If the number of columns is different in all Spreadsheets, please use the following script.
// var maxLen = Math.max(...values.map(r => r.length));
// values = values.map(r => r.length < maxLen ? [...r, ...Array(maxLen - r.length).fill("")] : r);
outputsheet.getRange(outputsheet.getLastRow() + 1, 1, values.length, values[1].length).setValues(values);
}
注:
- 当Spreadsheet ID数量较多时,处理时间可能超过6分钟。我很担心这个。到时候把Spreadsheet ID分开怎么样?