Deaktivieren Sie die Kontrollkästchen in einem Array (Google Apps Script - Sheets).
Ich versuche, ein Skript zu schreiben, das alle Kontrollkästchen in einem Google Sheet findet und sie alle auf deaktiviert zurücksetzt. (Eine tägliche Bereinigung der Blätter) Ich kann ein Array aller Zellen, die Kontrollkästchen enthalten, von einem Blatt abrufen und deaktivieren, aber ich drehe hier meine Räder, um zu überprüfen, wie alle Kontrollkästchen auf allen Blättern effizient deaktiviert werden können. Ich sehe, dass es eine Methode namens uncheck () gibt, also versuche ich das zu verwenden. Mein Skript und Array ist unten. Meine Fragen sind ...
Momentan durchlaufe ich das Array und deaktiviere jedes Kontrollkästchen einzeln. Das Skript ist etwas langsam und mein Endziel ist es, dass alle Blätter in der Tabelle durchlaufen werden. Ich bin besorgt, dass das Skript möglicherweise eine Zeitüberschreitung aufweist. Gibt es eine Möglichkeit, alle Kontrollkästchen auf einem Blatt gleichzeitig zu deaktivieren, ohne eine Schleife zu erstellen, die jeweils 1 Blatt durchläuft? Oder noch besser, alle Kontrollkästchen auf allen Blättern gleichzeitig ausführen zu lassen? Natürlich wäre es effizienter, sie auf einmal zu deaktivieren, aber idk, wenn das eine Option ist und alles, was ich versucht habe, nicht funktioniert hat. (Ich habe auch überlegt, die Datei jeden Tag durch eine Vorlagendatei zu ersetzen, in der alle Kontrollkästchen bereits deaktiviert sind. Die Dokument-ID muss sich jedoch nie ändern.)
Wie kann ich mein Skript dazu bringen, alle Registerkarten der Tabelle zu durchlaufen? Würde das bedeuten, alle Blätter zu bekommen und eine weitere for-Schleife zu machen? Oder gibt es auch einen effizienteren Weg, dies zu tun?
Skript:
function uncheckCheckboxes() {
var spreadsheet=SpreadsheetApp.getActive(); // get spreadsheet
var sheet=spreadsheet.getActiveSheet(); // get current sheet
var allRange=sheet.getDataRange(); // get all data in sheet
var validations=allRange.getDataValidations();
var Checkboxes=[]; // create empty array
for(var i=0;i<validations.length;i++) {
for(var j=0;j<validations[i].length;j++) {
var rule=validations[i][j];
if(rule!=null) {
var criteria = rule.getCriteriaType();
if(criteria == SpreadsheetApp.DataValidationCriteria.CHECKBOX) {
Checkboxes.push(Utilities.formatString('%s', sheet.getRange(i+1,j+1).getA1Notation())); // get array of only cells w/ checkboxes
}
}
}
}
Logger.log(Checkboxes) // Logging
for (var CB in Checkboxes) { // Loop through array
var checkbox = Checkboxes[CB];
sheet.getRange(checkbox).uncheck(); // uncheck checkbox
}
}}
Array aus 1 Blatt (gespeichert in der Variablen 'Checkboxes'): [C3, D3, E3, F3, G3, H3, C4, D4, E4, F4, G4, H4, C5, D5, E5, F5, G5, H5, C6, D6, E6, F6, G6, H6, C7, D7, E7, F7, G7, H7, C8, D8, E8, F8, G8, H8, C9, D9, E9, F9, G9, H9, C10, D10, E10, F10, G10, H10, C11, D11, E11, F11, G11, H11, C12, D12, E12, F12, G12, H12, C13, D13, E13, F13, G13, H13, C14, D14, E14, F14, G14, H14, C15, D15, E15, F15, G15, H15, C16, D16, E16, F16, G16, H16, C17, D17, E17, F17, G17, H17, C18, D18, E18, F18, G18, H18, C19, D19, E19, F19, G19, H19, C20, D20, E20, F20, G20, H20, C21, D21, E21, F21, G21, H21, C22, D22, E22, F22, G22, H22, C23, D23, E23, F23, G23, H23, C24, D24, E24, F24, G24, H24, C25, D25, E25, F25, G25, H25, C26, D26, E26, F26, G26, H26, C27, D27, E27, F27, G27, H27, C28, D28, E28, F28, G28, H28, C29, D29, E29, F29, G29, H29]
Ich habe stundenlang daran gearbeitet und würde gerne etwas Fachwissen von jemandem haben, der tatsächlich weiß, was er tut. (Ich bin definitiv kein JavaScript-Experte!)
Danke im Voraus.
Bernstein
Antworten
Ungetestet, kann momentan nicht getestet werden.
function uncheckCheckboxesFromAllSheets() {
// Should uncheck all checkboxes from all worksheets
// in a given document.
const spreadsheet = SpreadsheetApp.getActive();
for (const sheet of spreadsheet.getSheets()) {
Logger.log(`About to uncheck checkboxes in sheet ${sheet.getName()}`);
sheet.getDataRange().uncheck();
}
}
Dokumentation für Range.uncheck()(https://developers.google.com/apps-script/reference/spreadsheet/range#uncheck):
Ändert den Status der Kontrollkästchen im Bereich in "deaktiviert". Ignoriert die Zellen in dem Bereich, die derzeit weder den aktivierten noch den nicht aktivierten Wert enthalten.
Denken Sie, dies bedeutet, dass Sie einen Bereich mit mehreren Zellen übergeben können und die uncheckFunktion sich intern um Details kümmert (z. B. das Überspringen irrelevanter Zellen).
Unabhängig: Wenn Sie ein Array haben und dessen Werte direkt durchlaufen müssen, verwenden Sie möglicherweise for-ofanstelle von loop for-in.