如何动态通过使用通配符在数组文字中对多个制表符范围进行动态分组? 更新:参考:

问题描述

我有一个包含多个标签的电子表格,例如

摘要
“第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列的数据。一旦在脚本中定义了它,就可以像使用任何工作表内置函数一样使用它。例如,参见:

enter image description here

更新:

如果要将所有数据写在同一列上,请改用此方法:

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

说明:

在脚本编辑器中保存代码段后,刷新工作表/浏览器。

steps


参考文献:

Google Apps Script库:

JavaScript库: