web-dev-qa-db-fra.com

Placer des cases à cocher dans Google Sheets à l'aide du script Apps

Je sais que la case à cocher est une fonctionnalité relativement nouvelle dans Google Sheets. J'essaie donc de trouver un moyen de créer automatiquement des cases à cocher dans les cellules. 

Jusqu'à présent, je n'ai trouvé aucune référence à ce sujet dans la documentation de Google Apps Script. 

Actuellement, je le fais manuellement, mais toute suggestion utilisant un script sera très appréciée.

5
Zyre Soriano

Je ne sais pas quand ils l'ont fait, mais ils l'ont ajouté maintenant. Utilisez la méthode requireCheckbox() de la classe DataValidationBuilder. Exemple:

function setCheckboxes() {
  // Assumes there's only one sheet
  var sheet = SpreadsheetApp.getActiveSheet();

  // This represents ALL the data
  var dataRange = sheet.getDataRange();

  /* Get checkbox range from sheet data range. Assumes checkboxes are on the
  left-most column
  */
  var dataRangeRow = dataRange.getRow();
  var dataRangeColumn = dataRange.getColumn();
  var dataRangeLastRow = dataRange.getLastRow();
  var checkboxRange = sheet.getRange(
    dataRangeRow,
    dataRangeColumn,
    dataRangeLastRow
  );

  var enforceCheckbox = SpreadsheetApp.newDataValidation();
  enforceCheckbox.requireCheckbox();
  enforceCheckbox.setAllowInvalid(false);
  enforceCheckbox.build();

  checkboxRange.setDataValidation(enforceCheckbox);
}
12
Andrew Miller

Vous souhaitez créer la case à cocher dans les cellules de la feuille de calcul à l'aide des scripts. Si ma compréhension est correcte, que diriez-vous de cette solution de contournement? Malheureusement, la classe SpreadsheetApp ne dispose pas encore de méthodes pour créer la case à cocher. (Lorsque de telles méthodes sont essayées, l'erreur se produit.) Je voudrais donc proposer de la créer à l'aide de l'API de feuille.

Quand j'ai vu ConditionType de dataValidation, le document de BOOLEAN dit

La valeur de la cellule doit être TRUE/FALSE ou dans la liste des valeurs de condition. Pris en charge par la validation des données. Rend sous forme de case à cocher de cellule. ...

Cela m'a permis de comprendre comment créer la case à cocher à l'aide de l'API Sheets. Le script suivant est un exemple de script. Cela crée 6 cases à cocher pour "A1: C3". Lorsque vous utilisez ce script, activez l'API Sheets dans Advanced Services de Google et la console API comme suit.

Activer les feuilles API v4 dans les services Google avancés

  • Sur l'éditeur de script
    • Ressources -> Services Google avancés
    • Activer l'API Google Sheets v4

Activer l'API v4 de feuilles sur la console de l'API

  • Sur l'éditeur de script
    • Ressources -> Projet de plateforme cloud
    • Voir la console de l'API
    • Dans Mise en route, cliquez sur Activer les API et obtenez les informations d'identification telles que des clés.
    • Sur le côté gauche, cliquez sur Bibliothèque.
    • Dans Search for APIs & services, saisissez des "feuilles". Et cliquez sur Google Sheets API.
    • Cliquez sur le bouton Activer.
    • Si l'API a déjà été activée, veuillez ne pas l'éteindre.

Si vous ouvrez maintenant l'éditeur de script avec le script d'utilisation de l'API Sheets, vous pouvez activer l'API Sheets pour le projet en accédant à cette URL https://console.cloud.google.com/apis/library/sheets.googleapis. com/

Exemple de script:

Dans cet exemple de script, les cases à cocher sont créées sous "A1: C3" de la feuille Sheet1. Veuillez utiliser ce script en tant que script lié au conteneur.

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetId = ss.getSheetByName("Sheet1").getSheetId();
var resource = {"requests": [
  {
    "repeatCell": {
      "cell": {"dataValidation": {"condition": {"type": "BOOLEAN"}}},
      "range": {"sheetId": sheetId, "startRowIndex": 0, "endRowIndex": 3, "startColumnIndex": 0, "endColumnIndex": 3},
      "fields": "dataValidation"
    }
  },
  {
    "updateCells": {
      "rows": [
        {"values": [{"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": false}}, {"userEnteredValue": {"boolValue": false}}]},
        {"values": [{"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": false}}]},
        {"values": [{"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": true}}]}
      ],
      "start": {"rowIndex": 0, "columnIndex": 0, "sheetId": sheetId},
      "fields": "userEnteredValue"
    }
  }
]};
Sheets.Spreadsheets.batchUpdate(resource, ss.getId());
  1. dataValidation est défini à l'aide de repeatCell.
  2. boolValue est défini à l'aide de updateCells.

Résultat :

 enter image description here

Remarque :

  • Ceci est un exemple de script simple. Veuillez donc modifier ceci pour votre environnement.
  • Lorsque les méthodes de la classe SpreadsheetApp pour créer la case à cocher peuvent être utilisées, je pense que l'exemple de script suivant peut être utilisé.

Le 22 juin 2018, ce script renvoie encore une erreur d'erreur du serveur.

var rule = SpreadsheetApp.newDataValidation().withCriteria(SpreadsheetApp.DataValidationCriteria.CHECKBOX, ["TRUE", "FALSE"]).build();
SpreadsheetApp.getActiveSheet().getRange("A1").setDataValidation(rule);

Références :

Si je comprends mal votre question, je suis désolé.

9
Tanaike

La case à cocher correspond au critère de validation des données récemment ajouté. Fait intéressant, lorsque j'essaie d'appeler la méthode 'getDataValidation ()' sur la plage contenant les cases à cocher, l'erreur suivante est générée:

var rule = range.getDataValidation();

Nous sommes désolés, une erreur de serveur s'est produite. S'il vous plaît attendez un peu et essayez à nouveau.

En attendant, vous pouvez contourner ce problème en cochant une case dans la feuille et en copiant sa validation des données dans la nouvelle plage. Par exemple, si "A1" est la cellule contenant la case à cocher et que la plage cible est constituée d'une seule colonne de 3 lignes:

var range = sheet.getRange("A1"); //checkbox template cell
var targetRange = sheet.getRange(rowIdex, colIndex, numOfRows, numOfCols);
range.copyTo(col, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION);
var values = [["true"], ["false"], ["false"]];
targetRange.setValues(values);
3
Anton Dementiev

Réponse courte

Ajoutez la case à cocher de l'interface utilisateur de Google Sheets, puis utilisez l'une des méthodes copyTo De Class Range .

Explication

Le service Tableur de scripts Google Apps n'inclut pas de méthode pour tout ce qui pourrait être fait via l'interface utilisateur de Google Sheets. C'est le cas de l'insertion> case à cocher qui est une fonctionnalité assez nouvelle.

Même la fonction macro Enregistrer ne peut pas faire cela. Ce qui suit a été enregistré il y a un moment

/** @OnlyCurrentDoc */

function InsertCheckbox() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A1').activate();
  /*
   * Added to show the missing Insert > Checkbox step
   */
  spreadsheet.getRange('B1').activate();
  spreadsheet.getRange('A1').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};

REMARQUE: Si vous ne souhaitez pas transmettre toutes les propriétés de la cellule (bordures, formules, arrière-plan, etc.) au lieu de SpreadsheetApp.CopyPasteType.PASTE_NORMAL, utilisez SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION.

Q sur le dépassement de pile

3
Rubén

Facile:

//There are two ways, using Range or using current cell or sheet or similar 
//First is using current cell
function VoF() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getCurrentCell().offset(1, 0, 499, 1).setDataValidation(SpreadsheetApp.newDataValidation()
  .setAllowInvalid(true)
  .setHelpText('TRUE or FALSE')
  .requireCheckbox() //if you customize this is possible that you dont get the boxes and the verification data could fail,so keep them standar with TRUE and FALSE
  .build());
};

//Second is using Spreedsheet ranges

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('G1:G11').activate();
  spreadsheet.getRange('G1:G11').setDataValidation(SpreadsheetApp.newDataValidation()
  .setAllowInvalid(false)
  .requireCheckbox()
  .build());
};

2
Tito
function onEdit() {
var cell = SpreadsheetApp.getActive().getRange('A1');
      var array =['☐','☑'];
    // var rule = SpreadsheetApp.newDataValidation().requireValueInList(['☐','☑']).build();
      var rule = SpreadsheetApp.newDataValidation().requireValueInList(array, false).build()
     cell.setDataValidation(rule);
     var valor = array[1];
     // Logger.log(valor);
      if(cell.getValue() == valor){
        cell.offset(0, 1).setValue("Aprobado");
      } else{
        cell.offset(0, 1).setValue("Reprobado");
      }
    }
2
Santos