Я искал много возможных ответов, но не могу найти тот, который работает. У меня есть Google Sheet с примерно 1600 строками, которые мне нужно разделить на около 70 различных вкладок (по 20-30 строк в каждой) на основе значения в столбце под названием «комната». Я сортировал, а затем вырезал и вставлял, но для 70+ вкладок это очень утомительно.
Я могу использовать функцию Query, но мне все еще нужно создать новую вкладку, вставить функцию и обновить параметр для этого конкретная вкладка.
Этот скрипт выглядел довольно близко:
ss = SpreadsheetApp.getActiveSpreadsheet();
itemName = 0;
itemDescription = 1;
image = 2;
purchasedBy = 3;
cost = 4;
room = 5;
isSharing = 6;
masterSheetName = "Master";
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Update Purchases')
.addItem('Add All Rows To Sheets', 'addAllRowsToSheets')
.addItem('Add Current Row To Sheet', 'addRowToNewSheet')
.addToUi();
}
function addRowToNewSheet() {
var s = ss.getActiveSheet();
var cell = s.getActiveCell();
var rowId = cell.getRow();
var range = s.getRange(rowId, 1, 1, s.getLastColumn());
var values = range.getValues()[0];
var roomName = values[room];
appendDataToSheet(s, rowId, values, roomName);
}
function addAllRowsToSheets(){
var s = ss.getActiveSheet();
var dataValues = s.getRange(2, 1, s.getLastRow()-1, s.getLastColumn()).getValues();
for(var i = 0; i < dataValues.length; i++){
var values = dataValues[i];
var rowId = 2 + i;
var roomName = values[room];
try{
appendDataToSheet(s, rowId, values, roomName);
}catch(err){};
}
}
function appendDataToSheet(s, rowId, data, roomName){
if(s.getName() != masterSheetName){
throw new Error("Can only add rows from 'Master' sheet - make sure sheet name is 'Master'");
}
var sheetNames = [sheet.getName() for each(sheet in ss.getSheets())];
var roomSheet;
if(sheetNames.indexOf(roomName) > -1){
roomSheet = ss.getSheetByName(roomName);
var rowIdValues = roomSheet.getRange(2, 1, roomSheet.getLastRow()-1, 1).getValues();
for(var i = 0; i < rowIdValues.length; i++){
if(rowIdValues[i] == rowId){
throw new Error( data[itemName] + " from row " + rowId + " already exists in sheet " + roomName + ".");
return;
}
}
}else{
roomSheet = ss.insertSheet(roomName);
var numCols = s.getLastColumn();
roomSheet.getRange(1, 1).setValue("Row Id");
s.getRange(1, 1, 1, numCols).copyValuesToRange(roomSheet, 2, numCols+1, 1, 1);
}
var rowIdArray = [rowId];
var updatedArray = rowIdArray.concat(data);
roomSheet.appendRow(updatedArray);
}
Но я всегда получаю неожиданную ошибку токена в строке 51 или 52:
var sheetNames = [sheet.getName() for each(sheet in ss.getSheets())];
(И, очевидно, имена столбцов и т. д. c. не обязательно являются правильными для моих данных, я попытался изменить их так, чтобы они соответствовали тому, что мне нужно. Не уверен, что это было частью проблемы.)
Вот пример моих данные: https://docs.google.com/spreadsheets/d/1kpD88_wEA5YFh5DMMkubsTnFHeNxRQL-njd9Mv-C_lc/edit?usp=sharing Это должно вернуть две отдельные вкладки / листы в зависимости от комнаты.
Я, очевидно, не программист и не знаю Visual Basi c или Java или чего-либо еще , Я просто знаю, как Google и копировать вещи .... удивительно, я часто заставляю его работать.
Дайте мне знать, что еще вам нужно, если вы можете помочь.