【问题标题】:Map or export Google Form responses to PDF Form fields将 Google 表单响应映射或导出到 PDF 表单字段
【发布时间】:2013-07-22 19:06:08
【问题描述】:

我想实现一个工作流程,让用户通过 Google 表单提交数据,然后他们的回复会自动发布到预先存在的 PDF 表单中。

我有几个我经常使用的 PDF 表单。我创建了一个 Google 表单来收集完成 PDF 所需的所有信息。现在我正在尝试找到一种将答案映射到原始 PDF 的方法。

我怎样才能做到这一点?

【问题讨论】:

  • 需要澄清。 “映射到原始 PDF”是什么意思?
  • 例如 - 在 Google 表单上,我要求提供姓名、地址、性别等信息。我想将这些信息安排在 pdf 文档中,需要相同的信息。本质上,我想使用 Google Forms 来填写 pdf 表格,而不是让用户下载 pdf 格式的表格;然后可能必须下载adobe reader(有些甚至可能打印并手动填写,我绝对不想要那个);在阅读器中填写表格;电子邮件表单 - 可能不完整(谷歌表单将帮助使用必填字段修复不完整的数据)。这有帮助吗?
  • 我想我明白了。您希望用户填写在线表单,然后让脚本获取他们的答案并将其“粘贴”到预先存在的 PDF 表单的输入字段中。是对的吗?或者您想根据用户的输入从头开始生成一个新的 PDF 文档?
  • 将它们放入预先存在的 PDF 表单中。

标签: google-apps-script google-sheets google-forms


【解决方案1】:

patentbytes.com 上有一篇文章,Automatically Completing Your PDF Forms,其中详细介绍了该主题,也是此答案的灵感来源。

使用 Google Apps 脚本,您无法修改现有的 PDF 表单。但是,您可以利用 Adob​​e Acrobat 和 Acrobat Reader 等应用程序中现有的导入功能,通过脚本以易于导入的方式生成表单数据。

这是一个想法:

  1. 让用户填写 Google 表单。使用表单设置确保回答必填问题。
  2. 在提交表单时,让包含电子表格的触发器函数生成包含用户答案的​​ XML 文件。使用文本替换来完成此操作很简单,但我们将使用另一种方法,使用 Google 的 XmlService。
  3. 将 XML 格式的答案发送给管理员。这可以通过电子邮件或通过将文件放入 Google 云端硬盘来完成。
  4. 使用 Adob​​e Acrobat 或 Reader 将 XML 文件导入 pdf 格式。 (如果需要。)

在继续之前,您的 PDF 表单需要具有特定的特征:

  • 必须是可填写的表格。
  • 它必须包括对表单数据的导出和导入的支持。 (在 Adob​​e Reader 中,您将看到一个“扩展”菜单,如此屏幕截图所示。)
  • 我们将使用前面提到的文章中的示例表单作为示例。它可以工作,但需要清理。

导出 XML 表单数据样本

使用 Acrobat Reader(或类似软件),完整填写示例表单,然后将表单数据导出为 XML。 (如果您使用将用于 HTML 模板的 camelCase 术语填写表单,它会简化未来的步骤 - 例如 inventionTitle。)

从导出的 XML 创建 HTML 模板

在 Apps 脚本编辑器中,使用 File-New 在项目中创建一个新的 html 文件,并将其命名为“formXml”。将导出的 xml 文件的文本内容粘贴到 formXml.html 中。

  • XML 声明需要在我们的最终输出中,但如果留在模板中会导致 HtmlService 崩溃。从模板中删除它;我们会将其添加回我们的代码中。

    <?xml version="1.0" encoding="UTF-8"?>
    
  • (可选)美化 XML,使其更容易避免引入错误。 (freeformatter.com 有一个有用的 xml 格式化程序。我发现第一次使用“紧凑模式”,然后第二次每缩进 2 个空格产生了很好的结果。

  • (可选)对字段进行逻辑重新排序。

  • 对于每个输入字段,将示例文本替换为有效的printing scriplets

    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>

代码.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);
}

表格和电子表格

触发函数处理的eventData对象中的namedValues来自Form Responses表,直接来自Form questions。 (这是保持问题简短的好理由,并依靠帮助文本进行详细说明!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多