Как я могу объединить текст с отфильтрованным столбцом в Google Таблицах?

#google-sheets #google-sheets-formula

#google-sheets #google-sheets-формула

Вопрос:

Я работаю с Google forms и Google Sheets. Я пытаюсь создать сводную таблицу, которая будет автоматически обновляться по мере заполнения формы.

Я смог извлечь данные из других листов, используя функцию ФИЛЬТРА. Теперь я хочу добавить столбец, в котором отображается название страны, в отфильтрованный столбец. Я попытался использовать concatenate, но это сработало не так хорошо, как я надеялся. Может кто-нибудь помочь мне выяснить, как решить эту проблему.

Пожалуйста, смотрите Здесь пример проблемы.

Комментарии:

1. Я не вижу названия стран в исходных таблицах. Где они расположены? Они только в названии листа? В таком случае вы были бы готовы использовать пользовательскую функцию Apps Script?

2. Я открыт для использования функции скрипта приложений. Пока это работает

Ответ №1:

Ну, это очень неэлегантный способ грубой силы, но я думаю, что это работает. Смотрите Решение-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")
  

Я добавил жестко закодированный литерал названия страны, повторил его столько раз, сколько необходимо для сопоставления строк данных, и поместил его в первый столбец в существующем массиве данных. Я повторяю это для второго массива, который у вас есть для второй страны.

Я уверен, что есть гораздо более элегантные способы сделать это, поэтому мы посмотрим, что еще предлагается. Если у вас где-то в вашем листе был список названий ваших стран — ie. Нигерия и Сьерра-Леоне, возможно, многие другие — я уверен, что элегантным решением было бы перебирать эти имена, извлекая имя для построения объединенных диапазонов данных, а также добавляя имя в качестве текста для каждой строки.

Без необходимости в списке на листе, немного кода может найти все ваши имена вкладок и исключить те, которые не являются данными, например. Решение здесь и резюме, а все остальное обработать как данные.

Примечание: я не понимаю, нужны ли вам ваши UNIQUE утверждения, если только вы по какой-то причине не ожидаете дубликатов. Кроме того, внешний QUERY , похоже, не нужен — внутренний FILTERs , похоже, делает все, что вам нужно.

Ответ №2:

Вы можете сделать это с помощью пользовательской функции Apps Script.

Сначала откройте связанный скрипт, выбрав Сервис> Редактор сценариев, и скопируйте в скрипт следующие функции (проверьте встроенные комментарии для получения более подробной информации о коде):

 // 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" amp;amp; 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 так же, как и любую встроенную функцию sheets. Эта функция будет принимать ряд параметров:

  • Разделенная запятыми строка с именами листов, данные которых должны быть суммированы (не добавляйте пробелы после запятой или аналогичные).
  • Разные диапазоны источников (в вашем случае, NIGERIA!A:E и 'SIERRA LEONE'!A:E ).

Оба эти способа необходимы, потому что, с одной стороны, указание исходных диапазонов в качестве параметров гарантирует, что функция выполняется и обновляет сводные данные каждый раз при редактировании исходных диапазонов, а с другой стороны, при передаче в качестве параметров эти исходные диапазоны не содержат информации об именах листов, который понадобится скрипту при возврате обобщенных данных.

Пример вызова функции:

введите описание изображения здесь

Ссылка: