我有一个 Google 表格,其中包含第一个主表格上的所有数据。我对脚本了解不多,这就是为什么我将所有脚本分开。
脚本 1。我运行一个脚本,用于创建以 A 列中的信息命名的新选项卡。 脚本 2。我运行另一个脚本来冻结上面脚本 1 制作的每张纸的第一行
脚本 3。我运行第三个脚本来调整所有行的大小。
我想知道如何:
4.将格式从第一个主工作表复制到使用脚本 (1) 自动创建的工作表。需要明确的是,我没有粘贴任何值 - 只是格式。
5.删除所有多余的列并删除除 3 个额外行之外的所有内容
6.有没有办法让它按字母顺序排列脚本 1 中创建的选项卡?现在,我必须按 A 列数据对主工作表进行排序,运行脚本 1,然后按姓氏(D 列)重新排序。我不想重复求助,但这对我的成功并不重要。
我并不反对所有脚本同时运行,而不是分开运行,我只是不知道如何将它们全部混合在一起。
我的谷歌表格是:https://docs.google.com/spreadsheets/d/1ME26lkh6F552uRQ3vl9Fv-BPIc2bpM_GlYxWCVoPkVA/edit?usp=sharing 脚本 1 已在此工作表上运行(新选项卡已创建)
脚本 1(新选项卡):
function makeTabs2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("All");
var last = sheet.getLastRow();//identifies the last active row on the sheet
for (var i = 1; i < last; i++) {
var tabName = sheet.getRange(i + 1, 1).getValue();//get the range in column A and get the value.
try {
if (ss.getSheetByName(tabName) == null) {
var create = ss.insertSheet(tabName);//create a new sheet with the value
// this is the addition to add the formula to the new tab
ss.getSheetByName(tabName).getRange("A1").setFormula('QUERY(All!A1:R,"select * where upper(A) = \'' + tabName.toUpperCase() + '\'",1)');
}
}
catch (err) {
Logger.log(err);
}
}
}
脚本 2(冻结顶行):
function freezeRowsAndColumns() {
var activeSheet = SpreadsheetApp.getActiveSheet();
activeSheet.setFrozenRows(1);
}
脚本 3(调整所有行的大小):
function resizeAllrows() {
var ss = SpreadsheetApp.getActive();
var requests = ss.getSheets().map(sheet => {
return {
updateDimensionProperties: {
properties: { pixelSize: 50 },
range: { sheetId: sheet.getSheetId(), dimension: "ROWS" },
fields: "pixelSize"
}
}
});
Sheets.Spreadsheets.batchUpdate({ requests: requests }, ss.getId());
}
任何/所有帮助将不胜感激。
我测试了在这里找到的代码的几种变体,但没有成功。
我相信您的目标如下。
getValue()
在循环中使用。在这种情况下,我认为首先,从循环外部的“A”列检索所有值。这可用于按字母顺序对新工作表进行排序。当这些点都体现在你的脚本中时,下面的修改如何?
在此修改中,您的脚本已被修改。
function makeTabs2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("All");
// --- I modified the below script.
var sheets = ss.getSheets().map(s => s.getSheetName());
var values = [...new Set(sheet.getRange("A2:A" + sheet.getLastRow()).getValues().map(([a]) => a))].sort((a, b) => a > b ? 1 : -1);
values.forEach(tabName => {
try {
if (!sheets.includes(tabName)) {
var create = sheet.copyTo(ss).setName(tabName).clearContents();
create.deleteColumns(19, create.getMaxColumns() - 18);
create.getRange("A1").setFormula('QUERY(All!A1:R,"select * where upper(A) = \'' + tabName.toUpperCase() + '\'",1)');
}
} catch (err) {
Logger.log(err.stack);
}
});
}
当我看到您提供的电子表格时,似乎要复制的页数是94。在这种情况下,我担心电子表格服务(SpreadsheetApp)可能会因为最长执行时间而无法使用。因此,作为另一项修改,我建议使用 Sheets API。
使用此脚本时,请在高级 Google 服务中启用 Sheets API。
function makeTabs3() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("All");
var sheetId = sheet.getSheetId();
var sheets = ss.getSheets().map(s => s.getSheetName());
var values = [...new Set(sheet.getRange("A2:A" + sheet.getLastRow()).getValues().map(([a]) => a))].sort((a, b) => a > b ? 1 : -1);
var requests = values
.filter(s => !sheets.includes(s))
.flatMap((tabName, i) => {
const newSheetId = `12345${i + 1}`;
return [
{ duplicateSheet: { sourceSheetId: sheetId, insertSheetIndex: i + 1, newSheetName: tabName, newSheetId } },
{ deleteDimension: { range: { sheetId: newSheetId, dimension: "COLUMNS", startIndex: 18 } } },
{ repeatCell: { fields: "userEnteredValue", range: { sheetId: newSheetId } } },
{ updateCells: { range: { sheetId: newSheetId, startRowIndex: 0, endRowIndex: 1, startColumnIndex: 0, endColumnIndex: 1 }, rows: [{ values: [{ userEnteredValue: { formulaValue: `=QUERY(All!A1:R,"select * where upper(A) = '${tabName.toUpperCase()}'",1)` } }] }], fields: "userEnteredValue" } }
]
});
if (requests.length == 0) return;
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}