如何将新创建的图纸设置为活动图纸?谷歌床单



我遇到了一个问题,由于无法切换到函数copyWithProtections生成的新创建的工作表,我不得不单独运行每个脚本,所以当下一个函数ClearValueAftercreatingnewsheet运行时,它在活动工作表上运行,而不是在新生成的工作表上,有办法将新创建的表作为活动工作表吗?

/* 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);
};

您可以通过工作表名称设置活动工作表。通过在一个函数中制作脚本,您可以使用新创建的输出表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设置活动工作表,但代码会更长。以下是设置活动工作表的参考: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});

在没有CCD_ 5的情况下,它也在清除原始片材。

最新更新