Google Apps Script: Как найти столбец в таблице?

Google Apps Script – мощный инструмент для автоматизации задач в Google Таблицах. Часто возникает задача поиска определенного столбца в таблице для чтения, записи или обновления данных. Эффективный поиск столбцов критически важен для оптимизации работы скриптов и обеспечения их надежности.

Зачем искать столбцы в таблице Google Apps Script

Поиск столбцов необходим для:

Динамической работы с таблицами, структура которых может меняться.

Автоматизации процессов импорта и обработки данных.

Создания отчетов и аналитики на основе данных из определенных столбцов.

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

Основные методы доступа к данным таблицы в Google Apps Script

В Google Apps Script доступ к данным таблицы осуществляется через объект SpreadsheetApp. Основные методы:

SpreadsheetApp.getActiveSpreadsheet(): Возвращает текущую активную таблицу.

Spreadsheet.getSheetByName(name): Возвращает лист таблицы по его имени.

Sheet.getDataRange(): Возвращает диапазон, содержащий все данные на листе.

Sheet.getLastColumn(): Возвращает индекс последнего столбца с данными.

Sheet.getLastRow(): Возвращает индекс последней строки с данными.

Range.getValues(): Возвращает двумерный массив, содержащий значения ячеек в диапазоне.

Простой поиск столбца по заголовку

Этот метод предполагает, что в первой строке таблицы содержатся заголовки столбцов. Мы будем искать столбец, заголовок которого соответствует заданному значению.

Получение заголовков столбцов в массив

Сначала необходимо получить массив заголовков из первой строки таблицы.

/**
 * Получает массив заголовков столбцов из таблицы.
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Лист таблицы.
 * @return {string[]} Массив заголовков столбцов.
 */
function getColumnHeaders(sheet: GoogleAppsScript.Spreadsheet.Sheet): string[] {
  const headerRange = sheet.getRange(1, 1, 1, sheet.getLastColumn());
  const headerValues: string[][] = headerRange.getValues();
  return headerValues[0] as string[];
}

Использование цикла `for` для поиска соответствия

Затем используем цикл for для перебора массива заголовков и поиска соответствия заданному заголовку.

/**
 * Ищет индекс столбца по заголовку, используя цикл for.
 * @param {string[]} headers Массив заголовков столбцов.
 * @param {string} targetHeader Искомый заголовок.
 * @return {number} Индекс столбца (начиная с 1) или -1, если не найден.
 */
function findColumnIndexByHeaderForLoop(headers: string[], targetHeader: string): number {
  for (let i = 0; i < headers.length; i++) {
    if (headers[i] === targetHeader) {
      return i + 1; // Индексы в Google Sheets начинаются с 1
    }
  }
  return -1; // Столбец не найден
}

Возврат индекса найденного столбца

Если соответствие найдено, функция возвращает индекс столбца (начиная с 1). Если столбец не найден, возвращается -1.

Обработка ситуации, когда столбец не найден

Важно предусмотреть ситуацию, когда столбец с заданным заголовком не найден. В этом случае, функция должна возвращать какое-либо значение, сигнализирующее об отсутствии столбца (например, -1 или null).

Поиск столбца с использованием метода `findIndex`

Метод findIndex позволяет более элегантно и кратко найти индекс элемента в массиве, удовлетворяющего заданному условию.

Реклама

Обзор метода `findIndex` для массивов

findIndex – это метод массивов в JavaScript, который возвращает индекс первого элемента в массиве, для которого функция-предикат возвращает true. Если ни один элемент не удовлетворяет условию, возвращается -1.

Применение `findIndex` для поиска столбца по заголовку

/**
 * Ищет индекс столбца по заголовку, используя метод findIndex.
 * @param {string[]} headers Массив заголовков столбцов.
 * @param {string} targetHeader Искомый заголовок.
 * @return {number} Индекс столбца (начиная с 1) или -1, если не найден.
 */
function findColumnIndexByHeaderFindIndex(headers: string[], targetHeader: string): number {
  const index = headers.findIndex(header => header === targetHeader);
  return index === -1 ? -1 : index + 1; // Индексы в Google Sheets начинаются с 1
}

Преимущества и недостатки использования `findIndex`

Преимущества:

Более лаконичный код.

Более читаемый код.

Недостатки:

Может быть менее понятен для начинающих программистов.

Потенциально немного медленнее для очень больших массивов (в большинстве случаев это не критично).

Более сложные сценарии поиска столбцов

Поиск столбца по частичному совпадению заголовка

В некоторых случаях требуется найти столбец, заголовок которого содержит определенную подстроку.

/**
 * Ищет индекс столбца по частичному совпадению заголовка.
 * @param {string[]} headers Массив заголовков столбцов.
 * @param {string} partialHeader Частичный заголовок.
 * @return {number} Индекс столбца (начиная с 1) или -1, если не найден.
 */
function findColumnIndexByPartialHeader(headers: string[], partialHeader: string): number {
  const index = headers.findIndex(header => header.includes(partialHeader));
  return index === -1 ? -1 : index + 1;
}

Поиск столбца, соответствующего нескольким критериям

Можно комбинировать различные условия для поиска столбца. Например, искать столбец, заголовок которого начинается с определенной строки и заканчивается определенной строкой.

Поиск столбца в определенном диапазоне строк

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

Оптимизация поиска столбцов в Google Apps Script

Кэширование данных заголовков для повышения производительности

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

let cachedHeaders: string[] | null = null;

/**
 * Получает заголовки столбцов из кэша или из таблицы.
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Лист таблицы.
 * @return {string[]} Массив заголовков столбцов.
 */
function getCachedColumnHeaders(sheet: GoogleAppsScript.Spreadsheet.Sheet): string[] {
  if (cachedHeaders === null) {
    cachedHeaders = getColumnHeaders(sheet);
  }
  return cachedHeaders;
}

Избежание ненужных операций чтения из таблицы

Каждая операция чтения из таблицы занимает время. Старайтесь минимизировать количество таких операций.

Использование специализированных функций для поиска

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


Добавить комментарий