我有一個問題,由于無法切換到由函式 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);
};
uj5u.com熱心網友回復:
您可以從作業表名稱設定活動作業表。通過在一個函式中撰寫腳本,您可以使用新創建的輸出表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});沒有 .activate() 它也會清除原始作業表。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/452729.html
