Récupérer les mails des personnes auxquelles j'ai partagé mon document

J’aimerai pouvoir exporter la liste des utilisateurs (pour pouvoir trier par département) ; comment pourrais-je procéder ? Je sais que des collègues ont un onglet utilisateurs de ce type.

Dans certains documents qui utilisent les permissions avancées, les propriétaires créent une table d’utilisateurs (la table d’appairage), qui est souvent affichée dans une page du document (sinon, accessible via les données source). C’est probablement ce que vous avez vu dans des « onglets utilisateurs ».

Si votre document n’a pas de permissions avancées, vous pouvez voir les utilisateurs ajoutés au document de 2 façons :

  • via le bouton « Partage »
  • via la console API : Paramètres > Console API > il faut trouver la requête GET /docs/{docId}/access, puis cliquer sur « Try it out » et « Execute »

Cette requête permet d’interroger directement la base de données du document Grist, pour vous retourner la liste des utilisateurs ayant accès au document.

En réponse, vous aurez alors un json (format structuré de données) avec notamment l’information sur les mails.

Attention, la réponse liste non seulement les éditeur·ices, propriétaires et lecteur·ices du document, mais aussi toutes les personnes qui ont accès à l’espace d’équipe ou au dossier (qui auront le champ "access":null). Il va donc falloir filtrer ces personnes.

Vous pouvez suivre les étapes suivantes pour extraire uniquement les mails de cette réponse :

  • Copier la réponse à l’aide de l’icone en bas à droite

  • La coller dans une nouvelle table dans Grist, dans la première colonne
  • Grist devrait typer la colonne en texte, c’est normal (il n’y a pas de type json)
  • Dans une deuxième colonne, créer la formule suivante, qui va transformer le texte en json, parcourir (parser) le json pour ajouter les emails dans une liste, puis retourner dans chaque ligne un élement de la liste :
import json

json_data = json.loads(ID_Table.lookupOne().ID_colonne)

users = json_data['users']

emails = []
for user in users:
    emails.append(user['email'])

return(emails[$id -1])

Il vous faudra remplacer ID_Table par l’identifiant de votre table, et ID_colonne par l’id de la colonne qui contient le json.

Il faut également ajouter autant de lignes à la table que d’utilisateur·ices (raccourci : Ctrl + entrée)

  • Dans une troisième colonne, ajoutez la formule suivante pour récupérer le rôle de chaque personne :
import json

json_data = json.loads(Table2.lookupOne().resultat_json)

users = json_data['users']

roles = []
for user in users:
    roles.append(user['access'])

return(roles[$id -1])
  • Filtrer la colonne sur "access":null pour éliminer les personnes n’ayant pas accès au document

Et voilà :cupid:

Document d’exemple ici : Ex - séparer texte sur plusieurs lignes / extraire mails document partagé - Grist

PS : il y a peut-être plus simple, et surtout plus efficace pour récupérer plusieurs champs du json, cf Parse multiple Json lines in a cell - Ask for Help - Grist Creators