У меня есть большой файл данных, который я хочу разделить/отфильтровать на отдельные вкладки на новом листе. Их необходимо отфильтровать по определенному столбцу, содержащему «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,
Точно. Он также должен принимать всю информацию, которая находится в той же строке.
Спасибо за ответ. Я думаю, что в вашем скрипте возникает ошибка в var ArrayRawData = RawMM.getRange(2,1,RawMM.getLastRow()-1,20).getValues();
, потому что getRange(row, column, numRows, numColumns)
— это метод Class Sheet. Итак, чтобы правильно понять вашу ситуацию, можете ли вы предоставить образец электронной таблицы? Конечно, пожалуйста, удалите вашу личную информацию.
Вот небольшой примерный список. Обычно столбцов с другими показателями было бы больше, но сейчас это проще. [ссылка] (docs.google.com/spreadsheets/d/…)
Спасибо, что ответили и поделились образцом. В вашем сценарии кажется, что столбец «G» имеет ConceptName
. Но в вашем общем образце электронной таблицы нет столбца «G». И лист только один в электронной таблице. Поэтому я не мог понять, что вы хотите сделать. Можете ли вы объяснить свою цель? В этом случае, можете ли вы обновить свой вопрос для образца электронной таблицы? Кстати, когда ваш сценарий был изменен с использованием общей электронной таблицы, можно ли использовать этот сценарий для вашей фактической электронной таблицы? Я беспокоюсь об этом.
Привет, я пошел и обновил код в вопросе, чтобы отразить предоставленные мной образцы данных. Цель состоит в том, чтобы иметь один лист со всеми необработанными данными [ссылка] (docs.google.com/spreadsheets/d/…), а скрипт должен создать новый лист и отсортировать данные по отдельным вкладкам, как показано здесь: [ссылка] (docs.google.com/spreadsheets/d/…)
Спасибо за ответ и добавление информации. Я думал, что могу понять твою цель. Я предложил модифицированный сценарий в качестве ответа. Не могли бы вы подтвердить это? Если я неправильно понял ваш вопрос, и это не тот результат, который вы хотите, я извиняюсь.
BGT, SWO, SWT, AI, DCO
.BGT, SWO, SWT, AI, DCO
в электронной таблице назначения.Я мог понять, как указано выше. Если я правильно понимаю, как насчет этой модификации? К сожалению, модифицированный сценарий во многом отличался от исходного сценария. Прошу прощения за это. Я думаю, что есть несколько ответов для вашей ситуации. Поэтому, пожалуйста, думайте об этом как об одном из них.
Поток модифицированного сценария выглядит следующим образом.
{"BGT": [values], "SWO": [values],,,}
.Перед запуском скрипта установите 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. СсылкаБольшое спасибо! Это как раз то, что мне было нужно.
@Cameron Potter Спасибо за ответ. Я рад, что ваша проблема была решена.
Значения, полученные с помощью
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
. Правильно ли я понимаю?