问题描述
“摘要”
“第1周”
“第2周”
“积压”
周数不是固定的。将来,随着时间的推移,我可能会添加更多标签,例如
“第3周”
“第4周”
...
在“摘要”选项卡中,我想列出所有“周”选项卡中列A(删除标题)中的所有数据。 目前,我必须在查询范围参数中手动添加“周”的所有标签名称,例如
=query({'Week 1'!A2:A; 'Week 2'!A2:A},"select *")
但是,如果以后我通过执行类似以下操作添加更多标签,我想自动创建它:
=query({"Week *"}!A2:A,"select *")
我该怎么做?
解决方法
一种选择是完全摆脱QUERY
公式,而改用Apps脚本Custom Function。
首先,通过选择工具>脚本编辑器打开绑定的脚本,然后将以下函数复制到脚本中:
function SUMMARIZE_WEEKTABS() {
const ss = SpreadsheetApp.getActive();
const weekSheets = ss.getSheets().filter(sheet => sheet.getName().startsWith("Week "));
const summarySheet = ss.getSheetByName("Summary");
let weekData = weekSheets.map(weekSheet => {
return weekSheet.getRange(2,1,weekSheet.getLastRow()).getValues().flat();
});
weekData = weekData[0].map((_,colIndex) => weekData.map(row => row[colIndex]));
return weekData;
}
函数SUMMARIZE_TABS
从所有以"Week "
开头的工作表中返回A列的数据。一旦在脚本中定义了它,就可以像使用任何工作表内置函数一样使用它。例如,参见:
更新:
如果要将所有数据写在同一列上,请改用此方法:
function SUMMARIZE_WEEKTABS() {
const ss = SpreadsheetApp.getActive();
const weekSheets = ss.getSheets().filter(sheet => sheet.getName().startsWith("Week "));
const summarySheet = ss.getSheetByName("Summary");
let weekData = weekSheets.map(weekSheet => {
return weekSheet.getRange(2,weekSheet.getLastRow() - 1).getValues();
}).flat();
return weekData;
}
参考:
,说明:
您可以使用Google Apps Script完成此任务。
以下脚本:
- 获取电子表格文件中包含名称的所有工作表
Week
, - 在这些工作表上迭代并构造一个字符串对象,该对象可以是 在查询公式中使用
- 将结果公式设置为摘要表的单元格 A1 。随时在下面的代码中修改 A1 。
我还添加了一个功能,该功能可以在工作表顶部创建一个宏按钮,因此您可以从工作表本身使用此功能(请参见下面的说明)。
解决方案:
请遵循有关如何使用以下代码的说明(gif):
function getQuery() {
const ss = SpreadsheetApp.getActive();
const summary_sheet = ss.getSheetByName('Summary');
const sheet_names = ss.getSheets().filter(fsh=>fsh.getName().includes("Week")).map(sh=>sh.getName())
var weeks = [];
sheet_names.forEach(wk =>
weeks.push(`'${wk}'!A2:A`)
)
summary_sheet.getRange('A1').setFormula(`=query({${weeks.join(";")}},"select *")`)
}
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Macros')
.addItem('Get Query','getQuery')
.addToUi();
}
说明:
在脚本编辑器中保存代码段后,刷新工作表/浏览器。
参考文献:
JavaScript库: