Vue personnalisée pour importer des données d'une table dans une autre

Bonjour,
Voici quelques éléments pour utiliser le widget « Bouton d’action ». J’essaierai d’alimenter la documentation officielle quand j’aurai avancé.

Le widget « Bouton d’Action » pour copier des données

:warning: La colonne contenant la formule du bouton d’action doit être typée en « Non défini ». Si elle est typée texte, vous aurez une erreur de type : " "bouton_action" cells should contain an object with keys "button", "description", "actions". Missing keys: "button", "description", "actions" "

Fonctionnement

  • Ajouter le custom widget « Bouton d’action », basé sur votre table

Screenshot 2025-03-20 at 13.27.05

  • Dans le panneau de création, autoriser l’accès au document

Pour copier des lignes dans la même table

  • Dans votre table, ajoutez une colonne formule, avec une formule ayant ce format :
{
    "button": "Texte d'affichage du bouton",
    "description": "Texte affiché au passage de la souris
    "actions":  
            [
            "AddRecord", "TableId", None, {"Col1": $Col1, "Col2": $Col2 }
           ]
}

Il vous faut remplacer TableId par l’identifiant de votre table, et Col1, Col2.. par les identifiants de vos colonnes.

  • Dans la configuration du widget, dans le champ « Action », sélectionnez cette colonne

  • Dans la configuration du widget, dans l’onglet « Données source » > Sélectionner par : choisir la table dans laquelle vous souhaitez dupliquer les données. Cela permettra au curseur de sélectionner toute la ligne quand vous cliquerez sur une cellule

  • Se positionner sur une ligne, cliquer sur le bouton d’action, et votre ligne devrait s’ajouter en fin de table.

Exemple :
Screenshot 2025-03-24 at 17.54.31

Pour copier des références simples

Au lieu de copier le champ directement, qui référence toute la ligne de la table référencée, il faut copier l’id de la ligne, via $Ma_Colonne.id

Par exemple :

{
  "button":"Dupliquer",
  "description":"hi",
  "actions":
  [[
     "AddRecord", 
     "Data", 
      None, 
     {
        "Ref": $Ref.id
     }
]]
}

Pour copier des références multiples

Il faut copier la liste des identifiants des lignes référencées, et la transformer en chaîne de caractère, via :
str($Ma_Colonne.id)

Par exemple :

{
  "button":"Dupliquer",
  "description":"hi",
  "actions":
  [[
     "AddRecord", 
     "Data", 
     None, 
     {
        "Ref_multiple": str($Ref_multiple.id)
     }
 ]]
}

Pour copier des choix multiples

Les colonnes choix multiples sont de type « tuple ». Les copier directement ne fonctionnera pas, même si la colonne de destination est de type choix multiple aussi.
Il faut ajouter un « L » en début de tuple.
On va donc d’abord transformer le tuple en liste, ajouter le « L », et retransformer la liste en tuple. La formule est la suivante :

choix_multiple = list($A)
choix_multiple.insert(0, "L")

return {
  "button":"Dupliquer",
  "description":":)",
  "actions":[[
    "AddRecord", 
    "Table_destination_choix_mult", 
    None, {
    "A":tuple(choix_multiple),
    }]]
}

Capture d’écran 2025-06-23 à 13.01.57

Pour copier des lignes dans une autre table

Idem que précédemment, en choisissant l’id de l’autre table comme table cible.
Exemple :
Screenshot 2025-03-24 at 17.56.09

Pour copier une ou plusieurs colonne·s d’une table à une autre
Il faudra faire une boucle pour copier toutes les lignes de chaque colonne ciblée. La formule sera de cette forme :

actions = []
records = Table_source.lookupRecords()
count = 0
for r in records:
      actions.append(["AddRecord", "Table_Cible", None, 
      {
      "Nom": r.Name, 
      "Numero": r.Number
      }
])
return {
      "button": "Copier la table",
      "description": ":P",
      "actions": actions
}

Ex :
Capture d’écran 2025-06-16 à 15.26.03

Document d’exemple ici : https://grist.incubateur.anct.gouv.fr/o/tutos-templates/8fGFgTJ3N6fe/ex-widget-Bouton-daction?utm_id=share-doc

Le widget « Bouton d’Action » pour supprimer une ligne

Syntaxe :

{
  "button":"Enlever ligne",
  "description":":)",
  "actions":[["RemoveRecord", "TableId", rowId]]
}

Le champ « actions » étant une liste, il faut toujours garder les deux crochets [[]].

On peut écrire le rowId en brut, par exemple :
"actions":[["RemoveRecord", "TableId", rowId]]

ou demander par exemple d’enlever la dernière ligne de la table :

"actions":[["RemoveRecord", "Table_a_reduire", Table_a_reduire.lookupOne(sort_by="-id").id]]

Capture d’écran 2025-06-30 à 17.22.12

Démo ici : https://grist.incubateur.anct.gouv.fr/o/tutos-templates/8fGFgTJ3N6fe/ex-widget-Bouton-daction/p/5

si on veut supprimer une ligne que l’on sélectionne dans la table plutôt que mettre l’identifiant de ligne en dur, il faut mettre la formule du bouton d’action dans la table qui est reliée, bien lier le widget bouton d’action à la table (sélectionner par) et utiliser $id

Le widget « Bouton d’Action » pour mettre à jour une ligne

On peut mettre à jour une ou plusieurs colonnes de la ligne sélectionnée dans la table.

  • Dans votre table, ajoutez une colonne formule, avec une formule ayant ce format :
{
  "button":"Modifier colonnes par OUI",
  "description":":)",
  "actions":[[
    "UpdateRecord", 
    "TableId", 
    $id, 
    {
    "Col1": "OUI",
     "Col2": "OUI",
  }
  ]]
}

Il vous faut remplacer TableId par l’identifiant de votre table, et Col1, Col2.. par les identifiants de vos colonnes.

  • Ajouter le widget personnalisé « Bouton d’Action », lié à la table (« Sélectionner par »)

  • Dans le panneau de création, dans le champ « Action », sélectionnez votre colonne contenant la formule du bouton d’action

  • Se positionner sur une ligne de la table, cliquer sur le bouton d’action, et votre ligne devrait être mise à jour.

Démo (dans ce cas on a créé 2 boutons d’action, qui mettent à jour une seule colonne en affectant « OUI » ou « NON ») :
2025-07-01 13.36.59

Lien document : https://grist.incubateur.anct.gouv.fr/o/tutos-templates/8fGFgTJ3N6fe/ex-widget-Bouton-daction/p/6

Autres actions possibles

D’après grist-core/app/common/DocActions.ts at 5f0c3bd8545256b4d3310ace197aace284ce8633 · gristlabs/grist-core · GitHub, les actions possibles semblent les suivantes :

  • AddRecord
  • BulkAddRecord
  • RemoveRecord
  • BulkRemoveRecord
  • UpdateRecord
  • BulkUpdateRecord
  • ReplaceTableData
  • TableDataAction
  • AddColumn
  • RemoveColumn
  • RenameColumn
  • ModifyColumn
  • AddTable
  • RemoveTable
  • RenameTable

J’ai testé « BulkAddRecord » mais n’ai pas réussi à le faire fonctionner.

Plusieurs actions en même temps

Il est possible de réaliser plusieurs actions en même temps (duplication de ligne, ajout, suppression) :

{
    "description": "Some description text",
    "button": "Text of the button itself",
    "actions": [ACTIONS_TO_APPLY],
}

Avec le champ actions qui est une liste d’actions, avec ce format (pour les cas les plus courants) :

[
  ["AddRecord", "TableId", None, {"Col1": Value1, "Col2": Value2, ...}],
  ["UpdateRecord", "TableId", rowId, {"Col1": Value1, "Col2": Value2, ...}],
  ["RemoveRecord", "TableId", rowId],
]
4 « J'aime »