如何将新建的sheet设置为活动的sheet? Googlesheets
How to set the newly created sheet as the active sheet? Google sheets
我有一个问题,由于无法切换到由函数 copyWithProtections 生成的新创建的 sheet,所以我必须单独 运行 每个脚本,所以当下一个函数 ClearValueAftercreatingnewsheet 运行s,在active sheet上的运行s不是新生成的,有没有办法让新创建的sheet成为active一个?
/* CAUTION: COPY WITH PROTECTION SHOULD BE RUNNED FIRST THEN CLEARVALUEAFTERCREATING NEW SHEET AFTER MAKING SURE THAT YOU MANUALLY CHANGED THE ACTIVE SHEET TO THE NEW SHEET WITH THE NUMBER */
//Copies with protection
function copyWithProtections(){
const sh = SpreadsheetApp.getActiveSpreadsheet();
const ss = sh.getSheetByName("Mar22");
const prot = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE)
let nSheet = ss.copyTo(sh).setName(sh.getNumSheets()-1);
let p;
for (let i in prot){
p = nSheet.getRange(prot[i].getRange().getA1Notation()).protect();
p.removeEditors(p.getEditors());
if (p.canDomainEdit()) {
p.setDomainEdit(false);
}
}
}
//Clears Values of new sheets
function ClearValueAftercreatingnewsheet() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A2:P144').activate().clear({contentsOnly: true});
spreadsheet.getRange('Z5').activate();
spreadsheet.getCurrentCell().setValue('');
spreadsheet.getRange('Z8').activate();
spreadsheet.getCurrentCell().setValue('');
spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
spreadsheet.getRange('A2:Q270').activate();
spreadsheet.getActiveRangeList().setBackground('#deeaf6');
spreadsheet.getRange('A2:R270').activate();
spreadsheet.getActiveRangeList().setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
};
您可以通过 sheet 名称设置活动 sheet。
通过在单个函数中创建脚本,您可以使用新创建的输出 sheet nSheet
并使用 getSheetName()
获取它的名称。然后您可以在清除值部分引用它。请尝试使用以下代码:
function copyAndClear() {
//Copies with protection
const sh = SpreadsheetApp.getActiveSpreadsheet();
const ss = sh.getSheetByName("Mar22");
const prot = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE)
let nSheet = ss.copyTo(sh).setName(sh.getNumSheets() - 1);
let p;
for (let i in prot) {
p = nSheet.getRange(prot[i].getRange().getA1Notation()).protect();
p.removeEditors(p.getEditors());
if (p.canDomainEdit()) {
p.setDomainEdit(false);
}
}
//Set the newly created sheet name in a variable to be used for reference
var nSheetName = nSheet.getSheetName();
//Clears Values of new sheets
var spreadsheet = sh.getSheetByName(nSheetName);
spreadsheet.getRange('A2:P144').activate().clear({contentsOnly: true});
spreadsheet.getRange('Z5').setValue('');
spreadsheet.getRange('Z8').setValue('');
spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
spreadsheet.getRange('A2:Q270').setBackground('#deeaf6');
spreadsheet.getRange('A2:R270').setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
};
我还简化了您的代码以避免冗余并缩短 运行 时间,因为根据您的代码,如果您可以直接在一行中设置它,则不需要 .activate()
。
如果可行,请告诉我!
您也可以通过 ID 设置活动 sheet 但代码会更长。
下面是设置active sheet的参考:https://spreadsheet.dev/activate-sheet-in-google-sheets-using-google-apps-script
编辑:我在第一行保留了 .activate()
spreadsheet.getRange('A2:P144').activate().clear({contentsOnly: true});
至于为什么我直接设置为
spreadsheet.getRange('A2:P144').clear({contentsOnly: true});
没有 .activate()
它也正在清除原来的 sheet。
我有一个问题,由于无法切换到由函数 copyWithProtections 生成的新创建的 sheet,所以我必须单独 运行 每个脚本,所以当下一个函数 ClearValueAftercreatingnewsheet 运行s,在active sheet上的运行s不是新生成的,有没有办法让新创建的sheet成为active一个?
/* CAUTION: COPY WITH PROTECTION SHOULD BE RUNNED FIRST THEN CLEARVALUEAFTERCREATING NEW SHEET AFTER MAKING SURE THAT YOU MANUALLY CHANGED THE ACTIVE SHEET TO THE NEW SHEET WITH THE NUMBER */
//Copies with protection
function copyWithProtections(){
const sh = SpreadsheetApp.getActiveSpreadsheet();
const ss = sh.getSheetByName("Mar22");
const prot = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE)
let nSheet = ss.copyTo(sh).setName(sh.getNumSheets()-1);
let p;
for (let i in prot){
p = nSheet.getRange(prot[i].getRange().getA1Notation()).protect();
p.removeEditors(p.getEditors());
if (p.canDomainEdit()) {
p.setDomainEdit(false);
}
}
}
//Clears Values of new sheets
function ClearValueAftercreatingnewsheet() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A2:P144').activate().clear({contentsOnly: true});
spreadsheet.getRange('Z5').activate();
spreadsheet.getCurrentCell().setValue('');
spreadsheet.getRange('Z8').activate();
spreadsheet.getCurrentCell().setValue('');
spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
spreadsheet.getRange('A2:Q270').activate();
spreadsheet.getActiveRangeList().setBackground('#deeaf6');
spreadsheet.getRange('A2:R270').activate();
spreadsheet.getActiveRangeList().setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
};
您可以通过 sheet 名称设置活动 sheet。
通过在单个函数中创建脚本,您可以使用新创建的输出 sheet nSheet
并使用 getSheetName()
获取它的名称。然后您可以在清除值部分引用它。请尝试使用以下代码:
function copyAndClear() {
//Copies with protection
const sh = SpreadsheetApp.getActiveSpreadsheet();
const ss = sh.getSheetByName("Mar22");
const prot = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE)
let nSheet = ss.copyTo(sh).setName(sh.getNumSheets() - 1);
let p;
for (let i in prot) {
p = nSheet.getRange(prot[i].getRange().getA1Notation()).protect();
p.removeEditors(p.getEditors());
if (p.canDomainEdit()) {
p.setDomainEdit(false);
}
}
//Set the newly created sheet name in a variable to be used for reference
var nSheetName = nSheet.getSheetName();
//Clears Values of new sheets
var spreadsheet = sh.getSheetByName(nSheetName);
spreadsheet.getRange('A2:P144').activate().clear({contentsOnly: true});
spreadsheet.getRange('Z5').setValue('');
spreadsheet.getRange('Z8').setValue('');
spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
spreadsheet.getRange('A2:Q270').setBackground('#deeaf6');
spreadsheet.getRange('A2:R270').setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
};
我还简化了您的代码以避免冗余并缩短 运行 时间,因为根据您的代码,如果您可以直接在一行中设置它,则不需要 .activate()
。
如果可行,请告诉我!
您也可以通过 ID 设置活动 sheet 但代码会更长。 下面是设置active sheet的参考:https://spreadsheet.dev/activate-sheet-in-google-sheets-using-google-apps-script
编辑:我在第一行保留了 .activate()
spreadsheet.getRange('A2:P144').activate().clear({contentsOnly: true});
至于为什么我直接设置为
spreadsheet.getRange('A2:P144').clear({contentsOnly: true});
没有 .activate()
它也正在清除原来的 sheet。