Auto alimentation d'une table en fonction d'autres tables

Bonjour à toutes et à tous,

J’essaye de mettre en place une table qui centralise les éléments clés de plusieurs tables afin de proposer toutes les options dans un seul menu déroulant sur une autre table.

*Ma structure est la suivante :
**Table Personnes : a Récupérer NomComplet
**Table Adresses : a Récupérer Nom_ObjetTech
**Table Telephones : a Récupérer Nom_ObjetTech
**Table Vehicules : a Récupérer Nom_ObjetTech

C’est éléments sont récupérés dans la table :
*Ref_ValeursUniques :
**Dossier : Reference Dossier
**RefPersonnes : Référence table Personnes NomComplet
**RefAdresses : Référence table Adresses Nom_ObjetTech
**RefTelephones : Référence table Telephones Nom_ObjetTech
**RefVehicules : Référence table Vehicules Nom_ObjetTech
**LibelleAffichage : renvoi la colonne non vide

Je souhaite donc automatiser ce processus mes recherches m’ont conduites vers un code python. Mais a priori étant sur une instance gouvernementale je ne peux accéder au code. La fonction « allowEditingUserCode: true ou enableUserCodeEditing: true » doit être activée.

Du coup je souhaiterai avoir si mon approche est cohérente et si il y a d’autres possibilités ou pistes de réflexion afin d’aboutir à mon objectif.

Merci par avance de votre aide

Bonjour à tous j’ai trouvé une solution à mon problème àtravers le bouton widget. En m’aidant de cette publication : https://forum.grist.libre.sh/t/vue-personnalisee-pour-importer-des-donnees-dune-table-dans-une-autre/873/5
J’ai donc créé une table Maintenance avec une colonne action ou j’ai appliqué le code suivant cela m’a permis de récupérer les informations de plusieurs tables sur une table. Si cela peut servir à quelqu’un

actions = []

# ---------- Compteurs par source ----------
removed_a = removed_p = removed_t = removed_v = removed_e = 0
updated_a = updated_p = updated_t = updated_v = updated_e = 0
created_a = created_p = created_t = created_v = created_e = 0

# ---------- Récupération de l'ID (référence) du dossier ----------
def get_dossier_id(obj):
    d = getattr(obj, "Dossier", None)
    return d.id if d else None

# ========= 0) Sets d'IDs vivants en source (pour purge) =========
ids_ad = set(r.id for r in Adresses.lookupRecords())
ids_pe = set(r.id for r in Personnes.lookupRecords())
ids_te = set(r.id for r in Telephones.lookupRecords())
ids_ve = set(r.id for r in Vehicules.lookupRecords())
# Emails peut ne pas exister selon le doc → on sécurise
try:
    _emails = Emails.lookupRecords()
    ids_em = set(r.id for r in _emails)
except NameError:
    _emails = []
    ids_em = set()

# ========= 1) PURGE des lignes orphelines =========
for row in Ref_ValeursUniques.lookupRecords():
    ts = getattr(row, "TypeSource", None)
    sid = getattr(row, "SourceRowId", None)
    if ts == "Adresses" and sid not in ids_ad:
        actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_a += 1
    elif ts == "Personnes" and sid not in ids_pe:
        actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_p += 1
    elif ts == "Telephones" and sid not in ids_te:
        actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_t += 1
    elif ts == "Vehicules" and sid not in ids_ve:
        actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_v += 1
    elif ts == "Emails" and sid not in ids_em:
        actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_e += 1

# ========= 2) ADRESSES : upsert =========
for r in Adresses.lookupRecords():
    lib = getattr(r, "LibelleSource", None)
    if not lib:
        continue
    sid = r.id
    exist = Ref_ValeursUniques.lookupRecords(TypeSource="Adresses", SourceRowId=sid)
    did = get_dossier_id(r)

    base = {"TypeSource": "Adresses", "SourceRowId": sid, "RefAdresse": lib}
    if exist:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did  # référence (ID)
        actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_a += 1
    else:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did
        actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_a += 1

# ========= 3) PERSONNES : upsert =========
for p in Personnes.lookupRecords():
    lib = getattr(p, "LibelleSource", None)
    if not lib:
        continue
    sid = p.id
    exist = Ref_ValeursUniques.lookupRecords(TypeSource="Personnes", SourceRowId=sid)
    did = get_dossier_id(p)

    base = {"TypeSource": "Personnes", "SourceRowId": sid, "RefPersonne": lib}
    if exist:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did
        actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_p += 1
    else:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did
        actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_p += 1

# ========= 4) TELEPHONES : upsert =========
for t in Telephones.lookupRecords():
    lib = getattr(t, "LibelleSource", None)
    if not lib:
        continue
    sid = t.id
    exist = Ref_ValeursUniques.lookupRecords(TypeSource="Telephones", SourceRowId=sid)
    did = get_dossier_id(t)

    base = {"TypeSource": "Telephones", "SourceRowId": sid, "RefTelephone": lib}  # adapte le nom si Ref_telephone
    if exist:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did
        actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_t += 1
    else:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did
        actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_t += 1

# ========= 5) VEHICULES : upsert =========
for v in Vehicules.lookupRecords():
    lib = getattr(v, "LibelleSource", None)
    if not lib:
        continue
    sid = v.id
    exist = Ref_ValeursUniques.lookupRecords(TypeSource="Vehicules", SourceRowId=sid)
    did = get_dossier_id(v)

    base = {"TypeSource": "Vehicules", "SourceRowId": sid, "RefVehicule": lib}  # adapte si Ref_Vehicule
    if exist:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did
        actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_v += 1
    else:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did
        actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_v += 1

# ========= 6) EMAILS : upsert (si la table existe) =========
for e in _emails:  # vide si Emails n'existe pas
    lib = getattr(e, "LibelleSource", None)
    if not lib:
        continue
    sid = e.id
    exist = Ref_ValeursUniques.lookupRecords(TypeSource="Emails", SourceRowId=sid)
    did = get_dossier_id(e)

    base = {"TypeSource": "Emails", "SourceRowId": sid, "RefEmail": lib}
    if exist:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did
        actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_e += 1
    else:
        data = dict(base)
        if did is not None:
            data["Dossier"] = did
        actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_e += 1

# ========= 7) Message multi-lignes =========
msg = f"""
✅ Synchronisation terminée

🧹 Purge
• Adresses   : {removed_a}
• Personnes  : {removed_p}
• Téléphones : {removed_t}
• Véhicules  : {removed_v}
• Emails     : {removed_e}

🏠 Adresses   — MAJ : {updated_a} | Créées : {created_a}
👤 Personnes  — MAJ : {updated_p} | Créées : {created_p}
📞 Téléphones — MAJ : {updated_t} | Créées : {created_t}
🚗 Véhicules  — MAJ : {updated_v} | Créées : {created_v}
📧 Emails     — MAJ : {updated_e} | Créées : {created_e}

⚙️ Dossier est écrit en RÉFÉRENCE (ID) et n'est pas écrasé s'il est absent côté source.
"""

return {
    "button": "Synchroniser les tables",
    "description": msg,
    "actions": actions
}