GoogleスプレッドシートからGoogleドキュメントへの差し込み印刷の方法


20

Microsoft ExcelとMicrosoft Wordを使用すると、スプレッドシートの行をWordファイルのページに簡単にマージできます。これは伝統的に紙の郵送に使用されていました。Googleドライブ/ Googleドキュメントでも同じことができますか?

スプレッドシートからメールへの差し込み印刷を提供するテンプレートがたくさんあります。Gmailで差し込み印刷を 行うにはどうすればよいですか?しかし、それは私が望んでいることではありません。


コピー/貼り付けを試みましたか?
ジェイコブヤントゥインストラ

4
10,000行のコピー/貼り付け?結構です。Word / Excelでも問題ありません。
ブライス14

回答:


8

そのためには、Google Apps Scriptを作成する必要があります。スプレッドシートの最初の行をフィールド名にして、フィールドがのように参照されるテンプレートドキュメントを作成できます[FIELD]

したがって、スプレッドシートが次のようになっている場合:

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

...次のようなテンプレート文書を作成できます

[NAME]様、[STREET]、[TOWN] [ZIP]に住んでいます...

スクリプトで新しい空のドキュメントを作成し、スプレッドシートの各行に対して新しいページを追加し、フィールドのプレースホルダーを行の値で検索/置換する必要があります。

ある程度機能するバージョンがありますので、多少の磨きが必要になる場合があります。ここで呼び出すことができますResult of mail mergeという名前の新しいドキュメントを作成ます。

独自のスクリプトの開始点として使用できます。あなたがそれに興味を持っているかどうかを教えてください、または私はスクリプトを完了するためにもう少し時間を費やすことができます。

スクリプトの内容:

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
スプレッドシート内からビルドするのではなく、スタンドアロンアプリケーションを使用することにしたのはなぜですか?これにより、OPがはるかに簡単になります。第二に、なぜスクリプトに多くのLogger呼び出しがあるのですか?スクリプトが過度に密集します。
ジェイコブヤントゥインストラ

Googleスクリプトアーカイブには、事前に作成されたスクリプトがいくつかありました...あなたや他の人がアップロードされない特別な理由はありますか?
ブライス

今までジェイコブのコメントに気づかなかったし、彼が言うように、それはおそらくスタンドアロンではなくスプレッドシートスクリプトであるべきだ。作業する時間を見つけてスクリプトギャラリーに送信できるかどうかを確認します。
ヴィダールS.ラムダル

5
Vidarこれは素晴らしい答えです。@JacobJanTuinstraが示唆したように、クリーンアップし、廃止されたメソッドの一部を更新し、不要な関数を削除し、スプレッドシート内から実行するように修正しました。それから、イメージを壊すバグがあることに気づき、そのバグの回避策も作成しました。今ではGithubに置くのに十分な気がします。私はそこにそれを投稿し、その中にあなたの回答へのリンクを提供しました。
ハディ

@hadiお疲れ様でした!
ヴィダールS.ラムダル

6

新しいGoogleドライブアドオンを使用すると、「まだ別の差し込み印刷」など、いくつかの差し込み印刷が可能です。

それを使用するには、「新しい」Googleスプレッドシートを用意し、アドオンメニューからアドオンをインストールする必要があります。

Google Spreadsheetsのスクリーンショット

を検索するとMail merge、いくつかのオプションがあります。


1日に100件のメールに制限されていることに注意してください(無料)。
ピクセイン

5

Google自身の投稿では、Googleスプレッドシート+ Googleドキュメントではなく、あるシートにフィードデータを、別のシートにテンプレートを設定する方法について説明しています:https : //developers.google.com/apps-script/articles/mail_merge

ただし、最終的な結果はMailApp、目的の「クローン」ドキュメントではなく、電子メールを送信することです。チュートリアルと@Vidarの答えを組み合わせることをお勧めします。

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

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?

ランダムAppScripts参照:


別の例としてこのGISTに出くわしたgist.github.com/mhawksey/1170597
drzaus

3
質問は、特にメールの差し込み印刷を除外します。
ブライス

3

autoCratをお勧めします。これは、マージのセットアップを支援するための優れたウィザードのようなインターフェースを備えたGoogleアドオンです。


1

私は同じ問題を抱えており、Vidarの答えでそれを解決しようとしましたが、非推奨のために機能しませんでした。

実際の解決策は、Vidarの回答に対するコメント内の@hadiによるリンクです。

Vidar
これは素晴らしい答えです。私はそれをクリーンアップし、非推奨メソッドの一部を更新し、不要な機能を処分した、として、スプレッドシート内から実行することも、それを修正 @ JacobJanTuinstraが 示唆されました。それから、イメージを壊すバグがあることに気づき、そのバグの回避策も作成しました。今ではGithubに置くのに十分な気がします。私はそこにそれを投稿し、その中にあなたの回答へのリンクを提供しました。
ハディ 15 年3月 4日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.

の手順に従うだけでReadme、テンプレートのGoogle-DocとGoogle-Sheetから結合ドキュメントを作成できました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.