我想实现一个工作流程,用户通过 Google 表单提交数据,他们的回复会自动发布到预先存在的 PDF 表单中。
我有几个经常使用的 PDF 表单。我创建了一个 Google 表单来收集完成 PDF 所需的所有信息。现在我试图找到一种方法来将答案映射到原始 PDF。
我怎样才能做到这一点?
最佳答案
在patentbytes.com 上有一篇文章,Automatically Completing Your PDF Forms ,其中详细介绍了该主题,这也是本答案的灵感来源。
使用 Google Apps Script,您无法修改现有的 PDF 表单。但是,您可以利用 Adobe Acrobat 和 Acrobat Reader 等应用程序中现有的导入功能,通过以易于导入的方式编写表单数据生成脚本。
这是想法:
在继续之前,您的 PDF 表单需要具有特定特征:
导出 XML 表单数据示例
使用 Acrobat Reader(或类似工具),完整填写示例表单,并将表单数据导出为 XML。 (如果您使用将用于 HTML 模板的驼峰式术语填写表单,则可以简化后续步骤 - 例如
inventionTitle
。)从导出的 XML 创建 HTML 模板
在 Apps 脚本编辑器中,使用 File-New 在项目中创建一个新的 html 文件,并将其命名为“formXml”。将导出的 xml 文件的文本内容粘贴到 formXml.html 中。
<?xml version="1.0" encoding="UTF-8"?>
inventionTitle becomes <?= inventionTitle ?>
表单XML.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>
代码.gs
这是表单提交触发函数。每次用户填写您的在线 google 表单时,此电子表格表单提交触发器将处理他们的回复,并在您的 google 驱动器上保存一个带时间戳的 xml 文件,准备导入到 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 对象中,来自 Form Responses 表,它直接来自于 Form 问题。 (这是保持问题简短的一个很好的理由,并依靠帮助文本来详细说明!)关于google-apps-script - 将 Google 表单响应映射或导出到 PDF 表单字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17795433/