Google ドキュメントの拡張

Google Apps Script を使用すると、Google ドキュメントの作成と変更をプログラムで行うことができます。また、新しいメニュー、ダイアログ ボックス、サイドバーを使用してユーザー インターフェースをカスタマイズすることもできます。

基本情報

Apps Script は、Google ドキュメントと 2 つの大きな方法でやり取りできます。1 つは、スクリプトのユーザーがドキュメントに対する適切な権限を持っている場合、任意のスクリプトでドキュメントを作成または変更できることです。もう 1 つは、スクリプトをドキュメントにバインドできることです。これにより、スクリプトでユーザー インターフェースを変更したり、ドキュメントを開いたときに応答したりできます。Google ドキュメント内からコンテナ バインド スクリプトを作成するには、[拡張機能] > [Apps Script] をクリックします。

いずれの場合も、次の例に示すように、Apps Script の Document Service を使用して Google ドキュメントを簡単に操作できます。

function createDoc() {
  var doc = DocumentApp.create('Sample Document');
  var documentTab = doc.getTab('t.0').asDocumentTab();
  var body = documentTab.getBody();
  var rowsData = [['Plants', 'Animals'], ['Ficus', 'Goat'], ['Basil', 'Cat'], ['Moss', 'Frog']];
  body.insertParagraph(0, doc.getName())
      .setHeading(DocumentApp.ParagraphHeading.HEADING1);
  table = body.appendTable(rowsData);
  table.getRow(0).editAsText().setBold(true);
}

上記のスクリプトは、ユーザーの Google ドライブに新しいドキュメントを作成し、ID が t.0 のタブ(デフォルトの最初のタブ)を取得し、ドキュメントの名前と同じテキストを含む段落を挿入し、その段落をタイトルとしてスタイル設定し、2 次元配列の値に基づいて表を追加します。スクリプトで DocumentApp.create() の呼び出しを DocumentApp.openById() または openByUrl() に置き換えることで、既存のドキュメントにこれらの変更を簡単に加えることができます。ドキュメント内で作成されたスクリプト(コンテナ バインド)の場合は、DocumentApp.getActiveDocument()Document.getActiveTab() を使用します。

ドキュメントの構造

Apps Script の観点から見ると、Google ドキュメントのドキュメントは HTML ドキュメントとよく似た構造になっています。つまり、ドキュメントは 1 つ以上の Tab オブジェクトで構成され、各オブジェクトには要素(ParagraphTable など)が含まれています。これらの要素には、他の要素が含まれていることがよくあります。Google ドキュメントのドキュメントを変更するほとんどのスクリプトは、getTab()asDocumentTab() の呼び出しで始まり、その後に getBody() が続きます。これは、Body が、HeaderSectionFooterSectionFootnotes を除くタブ内の他のすべての要素を含むコア要素であるためです。

ただし、どのタイプの要素に他のタイプを含めることができるかについてはルールがあります。また、Apps Script のドキュメント サービスでは、特定の種類の要素しか他の要素に挿入できません。次のツリーは、特定のタイプの要素に含めることができる要素を示しています。

太字で示された要素は挿入できます。太字以外の要素は、その場で操作することしかできません。

テキストを置き換える

Apps Script は、Google ドキュメントのテキストの置換によく使用されます。たとえば、クライアント情報が満載のスプレッドシートがあり、各クライアント用にパーソナライズされた Google ドキュメントを生成するとします。(このタイプの操作は、差し込み印刷とも呼ばれます)。

テキストを置き換える方法はたくさんありますが、最も簡単なのは次の例に示す replaceText() メソッドです。replaceText は、JavaScript の正規表現機能のほとんどをサポートしています。次の最初の関数は、Google ドキュメントにプレースホルダ テキストを数行追加します。実際には、プレースホルダをドキュメントに自分で入力する可能性が高くなります。2 番目の関数は、プレースホルダを client オブジェクトで定義されたプロパティに置き換えます。

これらの関数はどちらも getActiveDocument() メソッドと getActiveTab() メソッドを使用します。これらのメソッドは Google ドキュメント内で作成されたスクリプトにのみ適用されます。スタンドアロン スクリプトでは、代わりに Document.getTab() と組み合わせて DocumentApp.create()openById()、または openByUrl() を使用します。

プレースホルダを追加する

function createPlaceholders() {
  var body = DocumentApp.getActiveDocument().getActiveTab().asDocumentTab().getBody();
  body.appendParagraph('{name}');
  body.appendParagraph('{address}');
  body.appendParagraph('{city} {state} {zip}');
}

プレースホルダを置き換える

function searchAndReplace() {
  var body = DocumentApp.getActiveDocument().getActiveTab().asDocumentTab().getBody();
  var client = {
    name: 'Joe Script-Guru',
    address: '100 Script Rd',
    city: 'Scriptville',
    state: 'GA',
    zip: 94043
  };

  body.replaceText('{name}', client.name);
  body.replaceText('{address}', client.address);
  body.replaceText('{city}', client.city);
  body.replaceText('{state}', client.state);
  body.replaceText('{zip}', client.zip);
}

カスタム メニューとユーザー インターフェース

メニュー、ダイアログ ボックス、サイドバーを追加して、Google ドキュメントをカスタマイズできます。ただし、スクリプトが操作できるのは、開いているドキュメントの現在のインスタンスの UI のみです。また、スクリプトがドキュメントにバインドされている場合に限られます。

Google ドキュメントにカスタム メニューダイアログを追加する方法をご覧ください。ダイアログまたはサイドバーのカスタム インターフェースの作成について詳しくは、HTML サービスガイドをご覧ください。カスタム インターフェースをアドオンの一部として公開する場合は、スタイルガイドに沿って、Google ドキュメント エディタのスタイルとレイアウトとの一貫性を保ってください。

Google ドキュメントのアドオン

アドオンは Google ドキュメント内で実行され、Google ドキュメント アドオンストアからインストールできます。Google ドキュメント用のスクリプトを開発し、世界中のユーザーと共有したい場合は、Apps Script を使用してスクリプトをアドオンとして公開できます。公開されたアドオンは、他のユーザーがアドオンストアからインストールできます。

Google ドキュメント用アドオンの作成方法については、ドキュメント用アドオンの作成に関するクイックスタートをご覧ください。

トリガー

Google ドキュメントにバインドされたスクリプトは、シンプルな トリガーを使用して、ドキュメントの onOpen イベントに応答できます。このイベントは、ドキュメントの編集権限を持つユーザーが Google ドキュメントでドキュメントを開くたびに発生します。

トリガーを設定するには、onOpen() という関数を作成します。このトリガーの例については、Google Workspace のカスタム メニューをご覧ください。シンプルなトリガーはメニューの追加に便利ですが、承認が必要な Apps Script サービスは使用できません。