Décochez les cases dans un tableau (Google Apps Script - Sheets)

Sep 05 2020

J'essaie d'écrire un script qui trouve toutes les cases à cocher dans une feuille Google et les réinitialise toutes sur non cochées. (Un nettoyage quotidien des feuilles) Je suis en mesure d'obtenir un tableau de toutes les cellules qui contiennent des cases à cocher d'une feuille et de les décocher, mais je fais tourner mes roues ici pour savoir comment décocher efficacement toutes les cases à cocher de toutes les feuilles. Je vois qu'il existe une méthode appelée uncheck (), c'est donc ce que j'essaie d'utiliser. Mon script et mon tableau sont ci-dessous. Mes questions sont ...

  1. Actuellement, je parcourt le tableau et décoche chaque case une par une. Le script est un peu lent et mon objectif final est de faire passer toutes les feuilles de la feuille de calcul. Je crains que le script expire. Existe-t-il un moyen de décocher toutes les cases à cocher sur une feuille à la fois, sans faire une boucle qui les parcourt une à la fois? Ou encore mieux de faire toutes les cases à cocher sur toutes les feuilles à la fois? Évidemment, les décocher en une fois serait plus efficace, mais idk si c'est une option et que tout ce que j'ai essayé n'a pas fonctionné. (J'ai également envisagé de remplacer le fichier chaque jour par un fichier modèle dont toutes les cases sont déjà décochées, mais j'ai besoin que l'ID du document ne change jamais)

  2. Comment faire en sorte que mon script passe par tous les onglets de la feuille de calcul? Est-ce que ce serait obtenir toutes les feuilles et en faire une autre boucle for? Ou y a-t-il un moyen plus efficace de le faire aussi?

Scénario:

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
  }

}

Tableau à partir d'une feuille (stockée dans la variable 'Cases à cocher'): [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]

J'y travaille depuis des heures et j'aimerais avoir l'expertise de quelqu'un qui sait vraiment ce qu'il fait. (Je ne suis certainement pas un expert en JavaScript!)

Merci d'avance.

ambre

Réponses

3 chillin Sep 05 2020 at 18:47

Non testé, impossible de tester pour le moment.

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();
    }
}

Documentation pour Range.uncheck()(https://developers.google.com/apps-script/reference/spreadsheet/range#uncheck):

Modifie l'état des cases à cocher de la plage en «non coché». Ignore les cellules de la plage qui ne contiennent actuellement ni la valeur cochée ni la valeur non cochée configurée.

Pensez que cela signifie que vous pouvez lui transmettre une plage multi-cellules et que la uncheckfonction se chargera en interne des détails pour vous (comme sauter les cellules non pertinentes).


Sans rapport: Si vous avez un tableau et que vous avez besoin de boucler directement sur ses valeurs, utilisez peut-être for-ofloop au lieu de for-in.