Comment fusionner des e-mails depuis une feuille de calcul Google vers un document Google?

20

Avec Microsoft Excel et Microsoft Word, il est facile de fusionner des lignes d'une feuille de calcul en pages dans un fichier Word. Cela était traditionnellement utilisé pour faire des envois papier. Comment puis-je faire de même avec Google Drive / Google Docs?

Il existe de nombreux modèles qui proposent le publipostage de la feuille de calcul au courrier électronique: comment puis-je effectuer un publipostage avec Gmail? mais ce n'est pas ce que je recherche.

Bryce
la source
Avez-vous essayé de copier / coller?
Jacob Jan Tuinstra
4
Copier / coller pour 10 000 lignes? Non merci. Word / Excel fera très bien l'affaire.
Bryce

Réponses:

8

Vous devrez rédiger un script Google Apps pour cela. Vous pouvez laisser la première ligne de la feuille de calcul être des noms de champs et créer un modèle de document dans lequel les champs sont référencés comme [FIELD].

Donc, si votre feuille de calcul ressemble à:

NAME  |  STREET             | ZIP    | TOWN
---------------------------------------------
Vidar | Karl Johans gate 15 | 0200   | Oslo
John  | 3021 Arlington Road | 123456 | Memphis, TN

... vous pourriez avoir un modèle de document comme

Cher [NAME], vivant à [STREET], [TOWN] [ZIP] ...

Votre script devra créer un nouveau document vide et pour chaque ligne de votre feuille de calcul, ajouter une nouvelle page et rechercher / remplacer les espaces réservés de champ par des valeurs de ligne.

J'ai une version quelque peu fonctionnelle, qui pourrait avoir besoin d'un peu de polissage. Il peut être invoqué ici . Il créera un nouveau document nommé Résultat du publipostage .

Vous pouvez l'utiliser comme point de départ pour votre propre script. Faites-moi savoir si vous êtes dedans, ou je peux passer plus de temps à terminer le script.

Contenu du script:

var selectedTemplateId = null;
var selectedSpreadsheetId = null;
var spreadsheetDocPicker = null;
var templateDocPicker = null;

function mailMerge(app) {
  var app = UiApp.createApplication().setTitle("Mail Merge");
  templateDocPicker = createFilePicker(app, "Choose template", 
         UiApp.FileType.DOCUMENTS, "templateSelectionHandler"); 
  templateDocPicker.showDocsPicker();
  return app;
};

function createFilePicker(app, title, fileType, selectionHandlerName) {
  Logger.log("Creating file picker for " + fileType);
  var docPicker = app.createDocsListDialog();
  docPicker.setDialogTitle(title);
  docPicker.setInitialView(fileType);
  var selectionHandler = app.createServerHandler(selectionHandlerName);
  docPicker.addSelectionHandler(selectionHandler);
  return docPicker;
}

function templateSelectionHandler(e) {
  var app = UiApp.getActiveApplication();
  selectedTemplateId = e.parameter.items[0].id;
  UserProperties.setProperty("templateId", e.parameter.items[0].id);
  Logger.log("Selected template: " + selectedTemplateId);
  var spreadsheetDocPicker = createFilePicker(app, "Choose spreadsheet", 
        UiApp.FileType.SPREADSHEETS, "spreadsheetSelectionHandler");
  spreadsheetDocPicker.showDocsPicker();
  return app;
}

function spreadsheetSelectionHandler(e) {
  var app = UiApp.getActiveApplication();
  UserProperties.setProperty("spreadsheetId", e.parameter.items[0].id);
  selectedSpreadsheetId = e.parameter.items[0].id;
  Logger.log("Selected spreadsheet: " + selectedSpreadsheetId);
  doMerge();
  return app;
}

function doMerge() {
  var selectedSpreadsheetId = UserProperties.getProperty("spreadsheetId");
  var selectedTemplateId = UserProperties.getProperty("templateId");
  Logger.log("Selected spreadsheet: " + selectedSpreadsheetId);
  var sheet = SpreadsheetApp.openById(selectedSpreadsheetId);
  Logger.log("Spreadsheet opened");
  Logger.log("Opening template: " + selectedTemplateId);
  var template = DocumentApp.openById(selectedTemplateId);
  Logger.log("Template opened");
  var templateFile = DocsList.getFileById(selectedTemplateId);
  var templateDoc = DocumentApp.openById(templateFile.getId());
  //var mergedFile = templateFile.makeCopy();
  var mergedDoc = DocumentApp.create("Result of mail merge");
  var bodyCopy = templateDoc.getActiveSection().copy();
  Logger.log("Copy made");
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var fieldNames = values[0];

  for (var i = 1; i < numRows; i++) {
    var row = values[i];
    Logger.log("Processing row " + i + " " + row);
    var body = bodyCopy.copy();
    for (var f = 0; f < fieldNames.length; f++) {
      Logger.log("Processing field " + f + " " + fieldNames[f]);
      Logger.log("Replacing [" + fieldNames[f] + "] with " + row[f]);
      body.replaceText("\\[" + fieldNames[f] + "\\]", row[f]);
    }
    var numChildren = body.getNumChildren();
    for (var c = 0; c < numChildren; c++) {
      var child = body.getChild(c);
      child = child.copy();
      if (child.getType() == DocumentApp.ElementType.HORIZONTALRULE) {
        mergedDoc.appendHorizontalRule(child);
      } else if (child.getType() == DocumentApp.ElementType.INLINEIMAGE) {
        mergedDoc.appendImage(child);
      } else if (child.getType() == DocumentApp.ElementType.PARAGRAPH) {
        mergedDoc.appendParagraph(child);
      } else if (child.getType() == DocumentApp.ElementType.LISTITEM) {
        mergedDoc.appendListItem(child);
      } else if (child.getType() == DocumentApp.ElementType.TABLE) {
        mergedDoc.appendTable(child);
      } else {
        Logger.log("Unknown element type: " + child);
      }
   }
   Logger.log("Appending page break");
   mergedDoc.appendPageBreak();
   Logger.log("Result is now " + mergedDoc.getActiveSection().getText());
  }
}

function testMerge() {
  UserProperties.setProperty("templateId", 
    "1pAXWE0uklZ8z-O_Tejuv3pWSTiSv583ptUTGPt2Knm8");
  UserProperties.setProperty("spreadsheetId", 
    "0Avea1NXBTibYdFo5QkZzWWlMYUhkclNSaFpRWUZOTUE");
  doMerge();
}


function doGet() {
  return mailMerge();
}
Vidar S. Ramdal
la source
1
Pourquoi avez-vous choisi d'utiliser une application autonome et non une version à partir de la feuille de calcul? Cela facilitera grandement la tâche du PO. Deuxièmement, pourquoi y a-t-il autant d'appels Logger dans le script? Cela rendra le script trop dense.
Jacob Jan Tuinstra
L'archive de scripts Google contenait des scripts prédéfinis ... y a-t-il une raison particulière pour laquelle la vôtre ou une autre n'y serait pas téléchargée?
Bryce
Je n'ai pas remarqué le commentaire de Jacob jusqu'à présent, et comme il le dit, il devrait probablement s'agir d'un tableur au lieu d'être autonome. Je vais voir si je peux trouver du temps pour y travailler et le soumettre à la galerie de scripts.
Vidar S. Ramdal,
5
Vidar C'est une excellente réponse. Je l'ai nettoyé et mis à jour certaines des méthodes obsolètes, je me suis débarrassé des fonctions inutiles et je l'ai également modifié pour qu'il soit exécuté à partir de la feuille de calcul comme l'a suggéré @JacobJanTuinstra. Puis j'ai réalisé qu'il y avait un bogue qui casse les images , et j'ai également fait une solution de contournement pour le bogue. Je pense qu'il est maintenant assez agréable d'être mis sur Github. Je l'ai posté là - bas et y ai fourni un lien vers votre réponse en tant que version de départ de l'ouvrage.
hadi
@hadi Bon travail!
Vidar S. Ramdal
6

Grâce aux nouveaux modules complémentaires de Google Drive , plusieurs possibilités de fusion et publipostage sont disponibles, comme "Yet Another Mail Merge".

Pour l'utiliser, vous devez disposer d'une "nouvelle" feuille de calcul Google et installer le module complémentaire via le menu Modules complémentaires:

Capture d'écran de Google Spreadsheets

Recherchez Mail mergeet vous trouverez plusieurs options.

Vidar S. Ramdal
la source
Notez qu'il est limité à 100 e-mails par jour (gratuitement).
pixeline
5

Le propre article de Google explique comment configurer les données de flux dans une feuille et le modèle dans une autre, plutôt qu'une feuille de calcul Google + Google Doc: https://developers.google.com/apps-script/articles/mail_merge

Cependant, le résultat final est MailAppd'envoyer un e-mail plutôt que le document "cloné" souhaité. Je suggérerais de combiner le tutoriel et la réponse de @ Vidar, quelque chose dans le sens de remplacer:

MailApp.sendEmail(rowData.emailAddress, emailSubject, emailText);

avec

var mergedDoc, bodyContent,
    // you'd have to make the DocumentTitle column for the following
    newTitle = rowData.DocumentTitle /* or set to a static title, etc */;

// make a copy of the template document -- see http://stackoverflow.com/a/13243070/1037948
// or start a new one if you aren't using the template, but rather text from a template field
if( usingTemplateFile ) {
    mergedDoc = templateDoc.makeCopy(newTitle)
    bodyContent = mergedDoc.getBody();
} else {
    mergedDoc = DocumentApp.create(newTitle);
    bodyContent = mergedDoc.getBody();
    bodyContent.setText(templateFieldContents);
}

// tweak the fillInTemplateFromObject to accept a document Body and use .replaceText() instead of .match as in mailmerge example
// .replaceText see https://developers.google.com/apps-script/reference/document/body#replaceText(String,String)
fillInTemplateFromObject(bodyContent, rowData);

// no append needed?

Références aléatoires AppScripts:

drzaus
la source
vient de parcourir
drzaus
3
La question exclut spécifiquement le publipostage par courrier électronique.
Bryce
3

Je recommande autoCrat . Il s'agit d'un module complémentaire Google avec une excellente interface de type assistant pour vous aider à configurer la fusion.

morphatique
la source
1

J'ai eu le même problème et j'ai essayé de le résoudre avec la réponse de Vidar, mais à cause de la dépréciation, cela n'a pas fonctionné.

La solution réelle est le lien de @hadi dans le commentaire sur la réponse de Vidar.

Vidar :
C'est une excellente réponse. Je l'ai nettoyé et mis à jour certaines des méthodes obsolètes, je me suis débarrassé des fonctions inutiles et je l'ai également modifié pour qu'il soit exécuté à partir de la feuille de calcul comme l'a suggéré @ JacobJanTuinstra . Puis j'ai réalisé qu'il y avait un bogue qui casse les images, et j'ai également fait une solution de contournement pour le bogue. Je pense qu'il est maintenant assez agréable d'être mis sur Github. Je l'ai posté là-bas et y ai fourni un lien vers votre réponse en tant que version de départ de l'ouvrage.
- hadi 4 mars 15 à 19:24 "

https://github.com/hadaf/SheetsToDocsMerge :

  A Google Apps Script that merges information from a Google Sheet into a 
  Template created by Google Docs. The result is a new Google Docs file 
  that is populated by the Sheet data.

Je viens de suivre les étapes de la Readmeet j'ai pu créer un document fusionné à partir d'un modèle Google-Doc et d'une feuille Google.

innovations bennett
la source