我遇到了一个问题,由于无法切换到函数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的情况下,它也在清除原始片材。