Come faccio a inviare la stampa unione da foglio di calcolo di Google a un documento di Google?


20

Con Microsoft Excel e Microsoft Word, è facile unire le righe da un foglio di calcolo in pagine in un file Word. Tradizionalmente veniva utilizzato per effettuare spedizioni cartacee. Come posso fare lo stesso con Google Drive / Google Docs?

Esistono molti modelli che offrono la stampa unione da foglio di calcolo a e-mail: come posso fare una stampa unione con Gmail? ma non è quello che sto cercando.


Hai provato a copiare / incollare?
Jacob Jan Tuinstra,

4
Copia / incolla per 10.000 righe? No grazie. Word / Excel andrà bene.
Bryce,

Risposte:


8

Per questo dovrai scrivere uno script di Google Apps . Puoi lasciare che la prima riga del foglio di calcolo sia un nome di campo e creare un documento modello in cui i campi facciano riferimento come [FIELD].

Quindi se il tuo foglio di calcolo è simile a:

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

... potresti avere un documento modello come

Caro [NAME], residente a [STREET], [TOWN] [ZIP] ...

Lo script dovrà creare un nuovo documento vuoto e, per ogni riga del foglio di calcolo, aggiungere una nuova pagina e cercare / sostituire i segnaposto di campo con i valori di riga.

Ho una versione un po 'funzionante, che potrebbe richiedere un po' di lucidatura. Può essere invocato qui . Creerà un nuovo documento denominato Risultato della stampa unione .

Potresti usarlo come punto di partenza per il tuo script. Fammi sapere se ti piace, o posso dedicare un po 'più di tempo a finire la sceneggiatura.

Contenuto dello 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();
}

1
Perché hai scelto di utilizzare un'app autonoma e non una build all'interno del foglio di calcolo? Ciò renderà molto più facile l'OP. In secondo luogo, perché nello script ci sono così tante chiamate al logger? Renderà la sceneggiatura troppo densa.
Jacob Jan Tuinstra,

L'archivio di script di Google aveva alcuni script predefiniti ... c'è qualche motivo particolare per cui il tuo o un altro non verrebbero caricati lì?
Bryce,

Fino ad ora non ho notato il commento di Jacob, e come dice, probabilmente dovrebbe essere uno script per fogli di calcolo invece che autonomo. Vedrò se riesco a trovare il tempo per lavorarci su e inviarlo alla galleria Script.
Vidar S. Ramdal,

5
Vidar Questa è un'ottima risposta. L'ho ripulito, ho aggiornato alcuni dei metodi deprecati, mi sono liberato di funzioni non necessarie e l'ho anche modificato per essere eseguito dal foglio di calcolo come suggerito da @JacobJanTuinstra. Poi mi sono reso conto che esiste un bug che rompe le immagini e ho anche risolto il problema. Sento che ora è abbastanza carino da essere messo su Github. L'ho pubblicato lì e in esso ho fornito un link alla tua risposta come versione iniziale del lavoro.
Hadi,

@hadi Ottimo lavoro!
Vidar S. Ramdal

6

Attraverso i nuovi componenti aggiuntivi di Google Drive , ci sono diverse possibilità di stampa unione, come "Yet Another Mail Merge".

Per utilizzarlo, è necessario disporre di un "nuovo" foglio di calcolo Google e installare il componente aggiuntivo tramite il menu Componenti aggiuntivi:

Schermata da fogli di calcolo di Google

Cerca Mail mergee troverai diverse opzioni.


Si noti che è limitato a 100 e-mail al giorno (gratuitamente).
pixeline

5

Il post di Google spiega come impostare i dati del feed in un foglio e il modello in un altro, anziché un foglio di calcolo di Google + Google Doc: https://developers.google.com/apps-script/articles/mail_merge

Tuttavia, il risultato finale è per l' MailAppinvio di una e-mail, piuttosto che il documento "clonato" desiderato. Suggerirei di combinare il tutorial e la risposta di @ Vidar, qualcosa sulla falsariga di sostituire:

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

con

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?

Riferimenti casuali di Script per app:



3
La domanda esclude specificamente la stampa unione di posta elettronica.
Bryce l'

3

Raccomando autoCrat . È un componente aggiuntivo di Google con un'eccellente interfaccia simile a una procedura guidata per aiutarti a configurare l'unione.


1

Ho avuto lo stesso problema e ho cercato di risolverlo con la risposta di Vidar, ma a causa della deprecazione non ha funzionato.

La vera soluzione è il link di @hadi nel commento sulla risposta di Vidar.

Vidar :
questa è un'ottima risposta. L'ho ripulito, ho aggiornato alcuni dei metodi obsoleti, mi sono liberato di funzioni non necessarie e l'ho anche modificato per essere eseguito dal foglio di calcolo come suggerito da @ JacobJanTuinstra . Poi mi sono reso conto che esiste un bug che rompe le immagini e ho anche risolto il problema. Sento che ora è abbastanza carino da essere messo su Github. L'ho pubblicato lì e in esso ho fornito un link alla tua risposta come versione iniziale del lavoro.
- Hadi, 4 marzo 15 alle 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.

Ho appena seguito i passaggi sul Readmee sono stato in grado di creare un documento unito da un modello di Google Doc e un foglio di Google.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.