【问题标题】:How can I concatenate text to a filtered column in Google Sheets?如何将文本连接到 Google 表格中的过滤列?
【发布时间】:2020-10-29 15:13:04
【问题描述】:

我正在使用谷歌表单和谷歌表格。我正在尝试创建一个汇总表,该表将在填写表格时自动更新。

我已经能够使用 FILTER 函数从其他工作表中提取数据。现在我想在过滤列中添加一个显示国家名称的列。我尝试使用连接,但它并没有像我希望的那样工作。谁能帮我弄清楚如何解决这个问题。

有关问题的示例,请参阅here

【问题讨论】:

  • 我在源表中看不到国家名称。这些在哪里?它们仅在工作表名称中吗?在这种情况下,您是否愿意使用 Apps Script 自定义函数?
  • 我愿意使用 Apps 脚本功能。只要有效

标签: google-sheets google-sheets-formula


【解决方案1】:

嗯,这是一种非常不雅的蛮力方式,但我认为它有效。请参阅工作表中的 Solution-GK。

=QUERY({
   {TRANSPOSE(SPLIT(REPT("Nigeria~",ROWS(UNIQUE(FILTER(NIGERIA!A:E,NIGERIA!C:C<TODAY(),NIGERIA!B:B="Charity Fundraiser")))),"~")),
                                         UNIQUE(FILTER(NIGERIA!A:E,NIGERIA!C:C<TODAY(),NIGERIA!B:B="Charity Fundraiser"))}; 
   {TRANSPOSE(SPLIT(REPT("Sierra Leone~",ROWS(UNIQUE(FILTER('SIERRA LEONE'!A:E,'SIERRA LEONE'!C:C<TODAY(),'SIERRA LEONE'!B:B="Charity Fundraiser")))),"~")),
                                              UNIQUE(FILTER('SIERRA LEONE'!A:E,'SIERRA LEONE'!C:C<TODAY(),'SIERRA LEONE'!B:B="Charity Fundraiser"))}},
  "select Col1,Col2,Col3,Col4, Col5 where Col2 is not null")

我添加了国家名称的硬编码文字,将其重复匹配数据行所需的次数,并将其放入现有数据数组的第一列。我对第二个国家/地区的第二个数组重复此操作。

我确信有更优雅的方法可以做到这一点,所以我们会看看还有什么建议。如果您的国家/地区名称表中有一个列表 - 即。尼日利亚和塞拉利昂,可能还有更多——我相信一个优雅的解决方案会循环遍历这些名称,提取名称以构建连接的数据范围,并将名称添加为每一行的文本。

不需要工作表中的列表,一点代码就可以找到所有选项卡名称,并排除非数据名称,例如。解决方案在这里和总结,并将其余所有作为数据处理。

注意:我不清楚您是否需要 UNIQUE 语句,除非您出于某种原因期望重复。此外,外部 QUERY 似乎没有必要 - 内部 FILTERs 似乎可以满足您的所有需求。

【讨论】:

    【解决方案2】:

    您可以使用 Apps 脚本 Custom Function 来做到这一点。

    首先,通过选择工具>脚本编辑器打开一个绑定脚本,然后将以下函数复制到脚本中(有关代码的更多详细信息,请查看内联 cmets):

    // Copyright 2020 Google LLC.
    // SPDX-License-Identifier: Apache-2.0
    
    function SUMMARIZE_FUNDRAISING_EVENTS(sheetNames, ...ranges) {
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      sheetNames = sheetNames.split(","); // Comma-separated string to array of sheet names
      const filteredData = sheetNames.map(sheetName => { // Iterate through each sheet name
        const sheet = ss.getSheetByName(sheetName);
        if (sheet) { // Check if sheet exists with this name
          const sheetData = sheet.getRange(2,1,sheet.getLastRow()-1,4).getValues(); // Source sheet data
          const filteredData = sheetData.filter(rowData => {
            return rowData[1] === "Charity Fundraiser" && rowData[2] < new Date()
          }); // Filter data according to date and type of event
          filteredData.forEach(filteredRow => filteredRow.unshift(sheetName)); // Add sheet name to filtered data
          return filteredData;
        }  
      }).flat();
      return filteredData;
    }
    

    定义后,您可以像使用任何工作表内置函数一样使用函数SUMMARIZE_FUNDRAISING_EVENTS。该函数将接受一系列参数:

    • 以逗号分隔的字符串,其中包含应汇总数据的工作表的名称(请勿在逗号后添加空格或类似内容)。
    • 不同的源范围(在您的情况下为NIGERIA!A:E'SIERRA LEONE'!A:E)。

    这两者都是必要的,因为一方面,将源范围指定为参数可确保函数在每次编辑源范围时执行并更新汇总数据,另一方面,当传递为参数,这些源范围不包含有关工作表名称的信息,脚本在返回汇总数据时将需要这些信息。

    函数调用示例:

    参考:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多