Google Apps Script: Как разделить строку на массив?

Google Apps Script (GAS) часто используется для автоматизации задач, связанных с обработкой данных в Google Workspace (Sheets, Docs, Forms и т.д.). Одной из фундаментальных операций при работе с текстовыми данными является преобразование строки в массив отдельных элементов. Это позволяет структурировать информацию и обрабатывать ее компоненты по отдельности.

Что такое строка и массив?

  • Строка (String): Последовательность символов, заключенная в одинарные или двойные кавычки (например, 'keyword1,keyword2' или "Джон Доу"). В GAS строки являются примитивным типом данных.
  • Массив (Array): Упорядоченная коллекция значений (элементов), где каждый элемент имеет числовой индекс. Массивы в GAS являются объектами и предоставляют множество методов для манипуляции данными (например, ['keyword1', 'keyword2']).

Зачем разделять строку на массив?

Разделение строки на массив необходимо во многих сценариях автоматизации и анализа данных:

  • Парсинг данных: Извлечение структурированной информации из неструктурированного текста (например, разбор CSV-строк, логов, URL-параметров).
  • Обработка пользовательского ввода: Разделение данных, введенных пользователем в ячейку таблицы или форму.
  • Работа с ключевыми словами: Разделение списка ключевых слов, разделенных запятыми или пробелами, для дальнейшего анализа или использования в API (например, Google Ads API).
  • Токенизация текста: Разбиение текста на отдельные слова или предложения для лингвистического анализа.

Метод split() для разделения строки

Основным инструментом для разделения строк в JavaScript и, соответственно, в Google Apps Script является встроенный метод split() объекта String.

Синтаксис и параметры метода split()

Метод split() вызывается у строки и возвращает новый массив строк.

/**
 * Разделяет строку на массив подстрок.
 *
 * @param {string} separator - Строка или регулярное выражение, определяющее точки разделения.
 * @param {number} [limit] - Необязательный параметр. Целое число, указывающее предел количества найденных подстрок.
 * @return {string[]} Массив строк, полученный после разделения.
 */
string.split(separator, limit);
  • separator: Определяет символ или шаблон, по которому будет производиться разделение. Если separator опущен или равен undefined, массив будет содержать один элемент — исходную строку. Если separator — пустая строка (''), строка будет разделена на массив отдельных символов.
  • limit: Необязательный параметр, определяющий максимальное количество элементов в результирующем массиве. Если лимит достигнут, оставшаяся часть строки не включается в массив (даже если содержит разделители).

Разделитель: строка или регулярное выражение

В качестве separator можно использовать как простую строку, так и объект регулярного выражения (RegExp). Использование RegExp позволяет реализовать более гибкие и сложные правила разделения.

Примеры использования split() с различными разделителями

/**
 * Демонстрирует различные способы использования метода split().
 */
function demonstrateSplit(): void {
  // Пример 1: Разделение по запятой
  const keywordsString: string = "Google Ads,PPC,SEM,Контекстная реклама";
  const keywordsArray: string[] = keywordsString.split(',');
  Logger.log(keywordsArray); // Вывод: [Google Ads, PPC, SEM, Контекстная реклама]

  // Пример 2: Разделение по пробелу
  const sentence: string = "Анализ данных для интернет-маркетинга";
  const words: string[] = sentence.split(' ');
  Logger.log(words); // Вывод: [Анализ, данных, для, интернет-маркетинга]

  // Пример 3: Разделение по символам
  const word: string = "GAS";
  const chars: string[] = word.split('');
  Logger.log(chars); // Вывод: [G, A, S]

  // Пример 4: Разделение с использованием RegExp (запятая или точка с запятой)
  const mixedData: string = "item1,item2;item3,item4";
  const itemsRegex: string[] = mixedData.split(/[,;]/);
  Logger.log(itemsRegex); // Вывод: [item1, item2, item3, item4]

  // Пример 5: Использование лимита
  const dataString: string = "a,b,c,d,e";
  const limitedArray: string[] = dataString.split(',', 3);
  Logger.log(limitedArray); // Вывод: [a, b, c]
}

Ограничение количества элементов в массиве

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

Разбор распространенных сценариев

Рассмотрим типовые задачи, решаемые с помощью split().

Разделение строки по запятой (CSV)

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

/**
 * Обрабатывает строку в формате CSV.
 *
 * @param {string} csvLine Строка с данными, разделенными запятыми.
 * @return {string[]} Массив значений.
 */
function parseCsvLine(csvLine: string): string[] {
  if (!csvLine) {
    return [];
  }
  // Простое разделение по запятой. Для сложных CSV может потребоваться 
  // более надежный парсер, учитывающий кавычки и экранирование.
  const values: string[] = csvLine.split(',');
  return values;
}

// Пример использования:
const campaignData: string = "Кампания 1,1500,50,10000";
const parsedData: string[] = parseCsvLine(campaignData);
Logger.log(parsedData); // Вывод: [Кампания 1, 1500, 50, 10000]
Реклама

Разделение строки по пробелам

Часто используется для получения отдельных слов из предложения или фразы.

/**
 * Разбивает текст на слова.
 *
 * @param {string} text Входной текст.
 * @return {string[]} Массив слов.
 */
function tokenizeText(text: string): string[] {
  if (!text) {
    return [];
  }
  // Разделение по одному или нескольким пробельным символам (пробел, таб и т.д.)
  const words: string[] = text.split(/\s+/);
  return words;
}

// Пример использования:
const adText: string = "Эффективная   реклама   в Google";
const adWords: string[] = tokenizeText(adText);
Logger.log(adWords); // Вывод: [Эффективная, реклама, в, Google]

Разделение строки по нескольким разделителям

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

/**
 * Разделяет строку по запятой, точке с запятой или вертикальной черте.
 *
 * @param {string} dataString Строка с данными.
 * @return {string[]} Массив элементов.
 */
function splitByMultipleDelimiters(dataString: string): string[] {
  if (!dataString) {
    return [];
  }
  const delimiters: RegExp = /[,;|]/; // Регулярное выражение для разделителей
  const elements: string[] = dataString.split(delimiters);
  return elements;
}

// Пример использования:
const reportData: string = "source1,100;source2|250,source3";
const sources: string[] = splitByMultipleDelimiters(reportData);
Logger.log(sources); // Вывод: [source1, 100, source2, 250, source3]

Удаление пустых элементов из массива после разделения

Иногда при разделении могут возникать пустые строки, например, если разделители идут подряд ('a,,b'). Их можно удалить с помощью метода filter().

/**
 * Разделяет строку и удаляет пустые элементы.
 *
 * @param {string} inputString Входная строка.
 * @param {string | RegExp} separator Разделитель.
 * @return {string[]} Массив непустых элементов.
 */
function splitAndFilterEmpty(inputString: string, separator: string | RegExp): string[] {
  if (!inputString) {
    return [];
  }
  const initialArray: string[] = inputString.split(separator);
  // Фильтруем массив, оставляя только непустые строки
  const filteredArray: string[] = initialArray.filter(item => item !== '');
  // Альтернативный вариант фильтрации (более краткий):
  // const filteredArray: string[] = initialArray.filter(Boolean);
  return filteredArray;
}

// Пример использования:
const messyData: string = ",data1,,data2,data3,";
const cleanData: string[] = splitAndFilterEmpty(messyData, ',');
Logger.log(cleanData); // Вывод: [data1, data2, data3]

Альтернативные методы разделения строк (если необходимо)

Хотя split() покрывает подавляющее большинство случаев, существуют и другие подходы.

Использование регулярных выражений (RegExp) для более сложного разделения

Для сценариев, где простого разделения недостаточно (например, нужно извлечь группы символов, соответствующие сложному паттерну, а не просто разделить по разделителю), можно использовать методы объекта RegExp, такие как exec() или match() объекта String.

/**
 * Находит все URL в тексте с помощью RegExp.match().
 *
 * @param {string} text Текст для анализа.
 * @return {string[] | null} Массив найденных URL или null.
 */
function findAllUrls(text: string): string[] | null {
  const urlRegex: RegExp = /https?:\/\/[^\s]+/g;
  // match() возвращает массив найденных совпадений или null
  const urls: string[] | null = text.match(urlRegex);
  return urls;
}

// Пример:
const logEntry: string = "User visited https://example.com and then http://google.com";
const foundUrls: string[] | null = findAllUrls(logEntry);
Logger.log(foundUrls); // Вывод: [https://example.com, http://google.com]

Создание собственной функции для разделения строк

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

Заключение

Краткое повторение основных моментов

  • Разделение строк в Google Apps Script эффективно выполняется с помощью встроенного метода String.prototype.split().
  • Метод split() принимает разделитель (строку или RegExp) и необязательный лимит количества элементов.
  • Регулярные выражения в split() позволяют задавать гибкие правила разделения (например, по нескольким разделителям).
  • Для удаления пустых элементов, образовавшихся после split(), удобно использовать метод Array.prototype.filter().
  • Для сложных задач извлечения данных могут применяться методы RegExp (match, exec).

Рекомендации по дальнейшему изучению работы со строками и массивами в Google Apps Script

  • Изучите другие методы String: substring(), slice(), replace(), match(), search().
  • Освойте методы Array: join(), map(), filter(), reduce(), forEach() для эффективной обработки данных после разделения.
  • Углубите знания в области регулярных выражений (RegExp) для решения нетривиальных задач парсинга текста.
  • Практикуйтесь на реальных задачах автоматизации в Google Sheets, Docs или других сервисах Google Workspace.

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