Tengo el problema de que tengo que ejecutar cada script solo debido a que no puedo cambiar a la hoja recién creada generada por la función copyWithProtections, por lo que cuando se ejecuta la siguiente función ClearValueAftercreatingnewsheet, se ejecuta en la hoja activa, no en la recién generada, ¿Hay alguna manera de tener la hoja recién creada como activa?
/* 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); };
Puede configurar la hoja activa desde el nombre de la hoja. Al hacer su secuencia de comandos en una sola función, puede usar la hoja de salida nSheet
recién creada y obtener su nombre usando getSheetName()
. Luego puede hacer referencia a él en la parte de valores claros. Pruebe el siguiente código en su lugar:
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); };
También he simplificado su código para evitar la redundancia y acortar el tiempo de ejecución ya que, según su código, no es necesario .activate()
si puede configurarlo directamente en una línea.
¡Hazme saber si esto funciona!
También puede configurar la hoja activa por ID, pero el código será mucho más largo. Aquí está la referencia para configurar la hoja activa: https://spreadsheet.dev/activate-sheet-in-google-sheets-using-google-apps-script
EDITAR: he mantenido el .activate()
en la primera línea
spreadsheet.getRange('A2:P144').activate().clear({contentsOnly: true});
como por alguna razón si lo configuro directamente como
spreadsheet.getRange('A2:P144').clear({contentsOnly: true});
sin .activate()
también está borrando la hoja original.