【发布时间】:2020-03-13 17:29:38
【问题描述】:
我已经搜索了许多可能的答案,但似乎找不到一个有效的答案。我有一个大约 1600 行的 Google 表格,我需要根据标题为“房间”的列中的值将其分成大约 70 个不同的选项卡(每个选项卡大约 20-30 行)。我一直在排序,然后剪切和粘贴,但是对于 70 多个标签,这非常乏味。
我可以使用查询功能,但我仍然需要创建一个新选项卡,粘贴该功能并更新该特定选项卡的参数。
这个脚本看起来很接近:
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())];
(显然列名等对于我的数据不一定正确,我尝试更改它们以匹配我需要的内容。不确定这是否是问题的一部分。)
这是我的数据示例:https://docs.google.com/spreadsheets/d/1kpD88_wEA5YFh5DMMkubsTnFHeNxRQL-njd9Mv-C_lc/edit?usp=sharing 这应该根据房间返回两个单独的选项卡/工作表。
我显然不是程序员,也不知道 Visual Basic 或 Java 什么的。我只知道如何用谷歌搜索和复制东西......令人惊讶的是,我经常让它工作。
如果您能提供帮助,请告诉我您还需要什么。
【问题讨论】:
标签: google-apps-script google-sheets google-apps-script-editor