Сортировка необработанных данных с одного листа на отдельные вкладки на новом листе в Google App Script

У меня есть большой файл данных, который я хочу разделить/отфильтровать на отдельные вкладки на новом листе. Их необходимо отфильтровать по определенному столбцу, содержащему «BGT» в строке.

Я очень новичок в использовании скриптов Google Apps, так что работа еще не завершена. Я могу перетаскивать данные с одного листа на другой, преобразовывать их в массив и назначать столбец, по которому я хочу сортировать. Я просто не могу правильно настроить фильтр.

function CreativeReport() {

  var ss = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet = ss.getSheetByName(SHEET_NAME);

  var folder = getDriveFolderFromPath("Daily Creative Audit");

  var fileId = folder.getFiles().next().getId();

  var RawMM = SpreadsheetApp.openById(fileId);
  var ArrayRawData = RawMM.getRange(2,1,RawMM.getLastRow()-1,5).getValues();

  var ConceptName = RawMM.getRange('A:A').getValues();
  var BGTFilter = ConceptName.includes("BGT");
  var BGTFilteredData = ArrayRawData.filter(function(item){ return item [6] === BGTFilter;}); 

  Logger.log(BGTFilteredData);

Столбец, который я хочу отсортировать, содержит ячейки, отформатированные следующим образом.

2019_BGT_Bigsale_300x50  
2019_SWT_Bigsale_300x50  
2019_AI_Bigsale_300x50  
2019_SWO_Bigsale_300x50  
2019_DCO_Bigsale_300x50.   

Цель состоит в том, чтобы скрипт отфильтровал эти необработанные данные и отсортировал их на отдельные листы в зависимости от ячеек, содержащих:

BGT  
SWO  
SWT  
AI  
DCO  

Код, который я ДОЛЖЕН вывести из системы только понятия, содержащие «BGT» в строке, но я получаю

TypeError: Cannot find function includes in object ,concept_name,

Значения, полученные с помощью getValues(), представляют собой двумерный массив. Так что, если Array.includes() можно использовать в скрипте Google Apps, в вашем скрипте ConceptName.includes("BGT") всегда будет false. И, к сожалению, Array.includes() нельзя использовать в Google Apps Script. Ссылка Кстати, можно вас спросить о sort it into separate sheets depending on the cells containing:? Есть 5 листов для BGT, SWO, SWT, AI, DCO. Например, вы хотите добавить 2019_BGT_Bigsale_300x50 к имени листа BGT. Правильно ли я понимаю?

Tanaike 31.05.2019 01:07

Точно. Он также должен принимать всю информацию, которая находится в той же строке.

Cameron Potter 31.05.2019 01:23

Спасибо за ответ. Я думаю, что в вашем скрипте возникает ошибка в var ArrayRawData = RawMM.getRange(2,1,RawMM.getLastRow()-1,20).getValues();, потому что getRange(row, column, numRows, numColumns) — это метод Class Sheet. Итак, чтобы правильно понять вашу ситуацию, можете ли вы предоставить образец электронной таблицы? Конечно, пожалуйста, удалите вашу личную информацию.

Tanaike 31.05.2019 01:29

Вот небольшой примерный список. Обычно столбцов с другими показателями было бы больше, но сейчас это проще. [ссылка] (docs.google.com/spreadsheets/d/…)

Cameron Potter 31.05.2019 01:40

Спасибо, что ответили и поделились образцом. В вашем сценарии кажется, что столбец «G» имеет ConceptName. Но в вашем общем образце электронной таблицы нет столбца «G». И лист только один в электронной таблице. Поэтому я не мог понять, что вы хотите сделать. Можете ли вы объяснить свою цель? В этом случае, можете ли вы обновить свой вопрос для образца электронной таблицы? Кстати, когда ваш сценарий был изменен с использованием общей электронной таблицы, можно ли использовать этот сценарий для вашей фактической электронной таблицы? Я беспокоюсь об этом.

Tanaike 31.05.2019 01:47

Привет, я пошел и обновил код в вопросе, чтобы отразить предоставленные мной образцы данных. Цель состоит в том, чтобы иметь один лист со всеми необработанными данными [ссылка] (docs.google.com/spreadsheets/d/…), а скрипт должен создать новый лист и отсортировать данные по отдельным вкладкам, как показано здесь: [ссылка] (docs.google.com/spreadsheets/d/…)

Cameron Potter 31.05.2019 02:00

Спасибо за ответ и добавление информации. Я думал, что могу понять твою цель. Я предложил модифицированный сценарий в качестве ответа. Не могли бы вы подтвердить это? Если я неправильно понял ваш вопрос, и это не тот результат, который вы хотите, я извиняюсь.

Tanaike 31.05.2019 02:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • У вас есть значения на «Лист1» в исходной электронной таблице.
  • Вы хотите разделить значения, проверив, содержит ли столбец «A» значения BGT, SWO, SWT, AI, DCO.
  • Вы хотите поместить разделенные значения в имена листов BGT, SWO, SWT, AI, DCO в электронной таблице назначения.

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

Поток модифицированного сценария выглядит следующим образом.

  1. Получить значения из исходного листа.
  2. Создайте объект для получения значений для каждого целевого листа.
    • Объект похож на {"BGT": [values], "SWO": [values],,,}.
  3. Поместите значения для целевых листов.

Модифицированный скрипт:

Перед запуском скрипта установите srcSpreadsheetId, dstSpreadsheetId и srcSheetName.

function CreativeReport() {
  // Variables: Please set them for your situation.
  var srcSpreadsheetId = "###"; // Please set the source Spreadsheet ID. In your sample, the Spreadsheet name is "Sample Raw Data".
  var dstSpreadsheetId = "###"; // Please set the destination Spreadsheet ID. In your sample, the Spreadsheet name is "Sorted Data".
  var srcSheetName = "Sheet1"; // Please modify this. In this sample, it's the same with your sample Spreadsheet.
  var dstSheetNames = ["BGT", "SWO", "DCO", "AI", "SWT"];

  // Open Spreadsheets
  var srcSS = SpreadsheetApp.openById(srcSpreadsheetId);
  var dstSS = SpreadsheetApp.openById(dstSpreadsheetId);

  // Retrieve values from the source sheet.
  var srcSheet = srcSS.getSheetByName(srcSheetName);
  var srcValues = srcSheet.getRange(2, 1, srcSheet.getLastRow() - 1, 5).getValues();

  // Create an object for retrieving values for each destination sheet.
  var object = srcValues.reduce(function(obj, e) {
    dstSheetNames.forEach(function(f) {
      if (e[0].indexOf(f) > -1) obj[f] = obj[f] ? obj[f].concat([e]) : [e];
    });
    return obj;
  }, {});

  // Put values for the destination sheets.
  dstSheetNames.forEach(function(e) {
    var sheet = dstSS.getSheetByName(e);
    sheet.getRange(sheet.getLastRow() + 1, 1, object[e].length, object[e][0].length).setValues(object[e]);
  });
}

Примечание:

  • Как упоминалось в моем комментарии, значения, полученные с помощью getValues(), представляют собой двумерный массив. Так что, если Array.includes() можно использовать в скрипте Google Apps, в вашем скрипте ConceptName.includes("BGT") всегда будет false. И, к сожалению, Array.includes() нельзя использовать в Google Apps Script. Ссылка
  • Этот модифицированный сценарий был подготовлен с использованием образцов электронных таблиц «Образцы необработанных данных» и «Отсортированные данные», которыми вы поделились. Поэтому, если ваша фактическая электронная таблица отличается от этих образцов, измените приведенный выше сценарий.
  • Когда значения исходной электронной таблицы и количество целевых листов значительно увеличиваются, я рекомендую использовать Sheets API для ввода значений для каждого целевого листа.

Использованная литература:

Большое спасибо! Это как раз то, что мне было нужно.

Cameron Potter 31.05.2019 17:00

@Cameron Potter Спасибо за ответ. Я рад, что ваша проблема была решена.

Tanaike 01.06.2019 01:12

Другие вопросы по теме