如何将新建的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。