ユーザーが Google フォーム経由でデータを送信すると、その回答が既存の PDF フォームに自動的に投稿されるワークフローを実装したいと考えています。
頻繁に使用する PDF フォームがいくつかあります。PDF を完成させるために必要なすべての情報を収集するために、Google フォームを作成しました。現在、回答を元の PDF にマップする方法を見つけようとしています。
どうすればそれを達成できますか?
ユーザーが Google フォーム経由でデータを送信すると、その回答が既存の PDF フォームに自動的に投稿されるワークフローを実装したいと考えています。
頻繁に使用する PDF フォームがいくつかあります。PDF を完成させるために必要なすべての情報を収集するために、Google フォームを作成しました。現在、回答を元の PDF にマップする方法を見つけようとしています。
どうすればそれを達成できますか?
Patentbytes.com の記事、Automatically Completing Your PDF Formsでは、このトピックについて詳しく説明しており、この回答のインスピレーションとなっています。
Google Apps Script では、既存の PDF フォームを変更できません。ただし、簡単にインポートできる方法でフォーム データの生成をスクリプト化することにより、Adobe Acrobat や Acrobat Reader などのアプリケーションの既存のインポート機能を活用できます。
アイデアは次のとおりです。
続行する前に、PDF フォームに特定の特性が必要です。
前述の記事のサンプル フォームを例として使用します。クリーンアップが必要ですが、動作します。
Acrobat Reader (または同様のもの) を使用して、サンプル フォームに完全に入力し、フォーム データを XML としてエクスポートします。(たとえば、HTML テンプレートに使用されるキャメルケース用語を使用してフォームに入力すると、今後の手順が簡素化されますinventionTitle
。)
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 ?>
フォーム 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>
フォーム送信トリガー関数は次のとおりです。ユーザーがオンラインの 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 オブジェクト内の は、フォームの質問から直接取得したフォームの回答シートから取得されます。(これは、質問を短くし、ヘルプ テキストを利用して詳細を説明する正当な理由です!)