Publipostage d'une feuille google spreadsheet

Bonjour,

j'aimerais beaucoup réussir à générer automatiquement des feuilles à partir d'un template que j'ai créé pour un groupe d'utilisateurs.

Ce que fais Autocrat avec un docs mais avec un sheet.

Savez vous si c'est possible?

Merci par avance!

Bonjour,

oui c'est possible, mais il faut un peu plus de précision et de matière

  • mets un lien vers ton template (simplifié)
  • est-ce une feuille ou un nouveau fichier ?

exemple

dupliquer une feuille semaine
-----------------------------
function dupliquer() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var actuelle = SpreadsheetApp.getActiveSheet();
  var actuel = actuelle.getName()
  var regExp = new RegExp("([0-9]+)", "g");
  var nouveau = regExp.exec(actuel)[0]*1 + 1
  nouveau = 'S'+ ('00' + nouveau).substring(1)
  SpreadsheetApp.getActiveSpreadsheet().insertSheet(nouveau);
  var nouvelle = doc.getSheetByName(nouveau);
  var plage = actuelle.getRange("A1:A4");
  plage.copyTo(nouvelle.getRange("A1"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  actuelle.hideSheet()
}

Bonjour!

merci beaucoup pour ta réponse.

L'objectif est de créer une feuille de suivi (au mois) pour des apprenants en formation. J'ai ma base de donnée d'adresses rattachées à la google suite, à partir de laquelle je veux pouvoir générer un fichier par adresse et si possible, gérer un partage par défaut.

Donc c'est un nouveau fichier à chaque fois qui contient des infos propres à l'apprenant (nom prénom...etc)

Voici un fichier simplifié: https://docs.google.com/spreadsheets/d/1jEQsz8iKI7BdJXfLwZgKJGI2fqHVbh3f_MxXuEZx04k/edit?usp=sharing

je ne maîtrise pas du tout les scripts dans sheet mais c'est l'occasion d'apprendre!

Merci encore

Hello,

je relance le sujet car je ne trouve pas de solution, quelqu'un peut-il m'aider?

Merci par avance!

Désolé, j'avais zappé ta réponse, je regarde. Je pense que lors de la duplication du fichier, les partages restent ceux du template, à vérifier.

Par contre, je ne trouve pas les adresses dont tu parles !

En attendant, voici un code à tester peut-être ... où users est en colonne A à partir de la ligne 2 de l'onglet users

function duplicateTemplate() {
  let template = SpreadsheetApp.getActive().getSheetByName('template')
  let users = SpreadsheetApp.getActive().getSheetByName('users').getRange("A2:A").getDisplayValues().flat() // To convert matriz to array

  users .forEach(user => {
    template.getRange("A1").activate()
    let nueva = SpreadsheetApp.getActiveSpreadsheet().duplicateActiveSheet()
    nueva.setName(user)
  })
};

Bonjour,

aucun problème, merci de ton aide!

je n'ai pas donné les adresses parce que je ne peux pas divulguer les adresses de mes apprenants.

ça marche plutôt pas mal! mais ça me crée des onglets alors que ce dont j'ai besoin c'est d'un fichier par user, est-ce que c'est possible?

J'ai trouvé ce bout de code

// This code uses the Sheets Advanced Service, but for most use cases
// the built-in method SpreadsheetApp.create() is more appropriate.
var sheet = Sheets.newSpreadsheet();
sheet.properties = Sheets.newSpreadsheetProperties();
sheet.properties.title = title;
var spreadsheet = Sheets.Spreadsheets.create(sheet);

Peut-on l'utiliser?

Faut vraiment que je me mette à javascript...

merci encore!

Ah oui, j'ai été trop rapide, c'est en effet la duplication d'onglets !! désolé ...

je reprendrai d'ici ce soir

oui pas de problème, je suis en train d'essayer de m'en sortir avec un script python de mon côté

Je ne connais pas python ou peu donc je suis intéressé par ton expérience !

Voici la solution GAS à adapter ...

function dupliquerTemplate(){
  var nom = "userXYZ"
  var template = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('template')
  var dossier = DriveApp.getFolderById("______id______du_________dossier________")
  var feuille = SpreadsheetApp.create("Copie_Template_" + nom)
  DriveApp.getFileById(feuille.getId()).moveTo(dossier);
  Logger.log(feuille.getId())
  var destination = SpreadsheetApp.openById(feuille.getId());
  template.copyTo(destination);
  destination.deleteSheet(destination.getSheets()[0])
}

En réalité, on crée d'abord sous drive et ensuite on déplace dans le dossier identifié par son id.

Il serait judicieux de sauvegarder l'id du fichier créé pour des consolidations futures.

Bonjour,

As-tu besoin d'aide complémentaire ?

Bonsoir,

désolé j'étais hors ligne ces derniers jours, merci pour le script!

j'ai de mon côté trouvé une solution avec Python et la librairie gspread, avec ça je crée une copie par personne nommée nom_PRENOM, je préremplis les infos de la personne (nom, prénom...etc) dans les cases prévues, je partage la copie à chaque personne en écriture et j'envoie un mail pour notifier le partage.

Le tout à partir d'un template et d'une base de données qui contient les infos utilisateurs.

Voici le code, je suis pas un expert il y a certainement moyen de l'améliorer...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gspread as gs
from oauth2client.service_account import ServiceAccountCredentials

# ------- PART 0: collect datas

# accès au drive

scope = [
    "adresse 1",
    "adresse 2",
]

credentials = ServiceAccountCredentials.from_json_keyfile_name(
    "nom_du_fichier_clé.json", scope
)
gc = gs.service_account(filename="chemin_vers_le_fichier_clé")

# Ouverture des feuilles dont on a besoin, en l'occurence le template et la base de données

sh0 = gc.open_by_key("spreadsheet_ID")

sh1 = gc.open_by_key("spreadsheet_ID")

# get the values
data = sh0.worksheet("un_onglet")

names = data.col_values(2)
firstNames = data.col_values(1)
status = data.col_values(6)
fullNames = data.col_values(8)
emails = data.col_values(3)

# ------- PART 1: mailing

for n in fullNames:
    # on crée une copie par utilisateur et on remplit les cases avec les infos utilisateur
    sheet = gc.copy(
        "template_ID",
        title=n,
        copy_permissions=True,
        folder_id="dossier_ID",
    )

    wsh = sheet.worksheet("un_onglet")

    index = fullNames.index(n)

    values = (
        names[index],
        firstNames[index],
        status[index],
    )

    for c, v in zip(range(2, 9), values):
        wsh.update(f"C{c}", v)

    # partage et notification
    message = f"""Bonjour {firstNames[index]},\n bla bla bla \n cordialement"""

    sheet.share(
        emails[index],
        perm_type="user",
        role="writer",
        notify=True,
        email_message=message,
    )

voilà voilà!

je ne peux pas envoyer de lien pour l'instant, dans le scope il faut des adresses spécifiques fournies par google

merci encore d'avoir pris du temps pour m'aider

et merci pour le partage de la solution

Pour info et en complément, l'API google bloque le nombre de partage à 50 toutes les 24 heures, a priori uniquement si on envoie un mail de notification de partage. Il y une API python dans les services google mais je ne la maîtrise pas, peut-être permet elle de contourner ce problème....

Rechercher des sujets similaires à "publipostage feuille google spreadsheet"