4

ユーザーが Google フォーム経由でデータを送信すると、その回答が既存の PDF フォームに自動的に投稿されるワークフローを実装したいと考えています。

頻繁に使用する PDF フォームがいくつかあります。PDF を完成させるために必要なすべての情報を収集するために、Google フォームを作成しました。現在、回答を元の PDF にマップする方法を見つけようとしています。

どうすればそれを達成できますか?

4

1 に答える 1

2

Patentbytes.com の記事、Automatically Completing Your PDF Formsでは、このトピックについて詳しく説明しており、この回答のインスピレーションとなっています。

Google Apps Script では、既存の PDF フォームを変更できません。ただし、簡単にインポートできる方法でフォーム データの生成をスクリプト化することにより、Adobe Acrobat や Acrobat Reader などのアプリケーションの既存のインポート機能を活用できます。

アイデアは次のとおりです。

  1. ユーザーに Google フォームに入力してもらいます。フォーム設定を使用して、必須の質問に確実に回答してください。
  2. フォームの送信時に、スプレッドシートに含まれるトリガー関数を使用して、ユーザーの回答を含む XML ファイルを生成します。テキスト置換を使用してこれを完了するのは簡単ですが、Google の XmlService を使用する別の方法を使用します。
  3. XML 形式の回答を管理者に送信します。これは、メールで行うか、Google ドライブにファイルを配置することで行うことができます。
  4. Adobe Acrobat または Reader を使用して、XML ファイルを PDF フォームにインポートします。(必要に応じて。)

続行する前に、PDF フォームに特定の特性が必要です。

  • 入力可能なフォームである必要があります。
  • フォーム データのエクスポートとインポートのサポートが含まれている必要があります。(Adobe Reader では、このスクリーンショットのように「拡張」メニューが表示されます。)
  • 前述の記事のサンプル フォームを例として使用します。クリーンアップが必要ですが、動作します。

    スクリーンショット

XML フォーム データのサンプルをエクスポートする

Acrobat Reader (または同様のもの) を使用して、サンプル フォームに完全に入力し、フォーム データを XML としてエクスポートします。(たとえば、HTML テンプレートに使用されるキャメルケース用語を使用してフォームに入力すると、今後の手順が簡素化されますinventionTitle。)

エクスポートされた XML から HTML テンプレートを作成する

Apps Script エディターで、File-New を使用してプロジェクトに新しい html ファイルを作成し、「formXml」という名前を付けます。エクスポートした xml ファイルのテキスト コンテンツを formXml.html に貼り付けます。

  • XML 宣言は最終出力に含める必要がありますが、テンプレートに残すと HtmlService がクラッシュします。テンプレートから削除します。コードに追加し直します。

    <?xml version="1.0" encoding="UTF-8"?>
    
  • (オプション) XML を整形して、エラーの発生を回避しやすくします。(freeformatter.com には便利な xml フォーマッタがあります。「コンパクト モード」での最初のパスに続いて、インデントごとに 2 つのスペースで 2 番目のパスを実行すると、良い結果が得られることがわかりました。

  • (オプション) フィールドを論理的に並べ替えます。

  • 入力フィールドごとに、サンプル テキストを有効な印刷スクリプトレットに置き換えます。

    inventionTitle    becomes   <?= inventionTitle ?>
    

formXml.html

フォーム XML テンプレートは次のようになります。この例で表されているフォーム フィールドは 5 つだけです。

<fields xmlns:xfdf="http://ns.adobe.com/xfdf-transition/">
  <TitleofInvention xfdf:original="Title of Invention"><?= inventionTitle ?></TitleofInvention>
  <Inventorone xfdf:original="Inventor one"><?= inventor1name ?></Inventorone>
  <Citizenof xfdf:original="Citizen of"><?= inventor1citizenship ?></Citizenof>
  <Inventortwo xfdf:original="Inventor two"><?= inventor2name ?></Inventortwo>
  <Citizenof_2 xfdf:original="Citizen of_2"><?= inventor2citizenship ?></Citizenof_2>
</fields>

Code.gs

フォーム送信トリガー関数は次のとおりです。ユーザーがオンラインの Google フォームに入力するたびに、このスプレッドシート フォーム送信トリガーが応答を処理し、タイムスタンプ付きの xml ファイルを Google ドライブに保存して、PDF フォームにインポートできるようにします。

function formSubmission(eventData) {
  // Get a handle on the xml template
  var formXml = HtmlService.createTemplateFromFile('formXml');

  // Replace templated values with user's input
  formXml.inventionTitle = eventData.namedValues['Invention Title'];
  formXml.inventor1name = eventData.namedValues['Inventor 1 Name'];
  formXml.inventor1citizenship = eventData.namedValues['Inventor 1 Citizenship'];
  formXml.inventor2name = eventData.namedValues['Inventor 2 Name'];
  formXml.inventor2citizenship = eventData.namedValues['Inventor 2 Citizenship'];

  // Evaluate the template with substitutions
  var xml = formXml.evaluate();

  // Get the evaluated template as text, prepend the XML Declaration
  var formXmlText = '<?xml version="1.0" encoding="UTF-8"?>' 
                  + xml.getContent();

  // Save user's input as an xml file on our Google Drive
  var fileName = 'Form ' + eventData.namedValues['Timestamp'];
  var xmlFile = DriveApp.createFile(fileName, formXmlText, MimeType.XML);
}

フォームとスプレッドシート

namedValuesトリガー関数によって処理される eventData オブジェクト内の は、フォームの質問から直接取得したフォームの回答シートから取得されます。(これは、質問を短くし、ヘルプ テキストを利用して詳細を説明する正当な理由です!)

スプレッドシートのスクリーンショット

于 2013-07-25T14:48:35.783 に答える