google-apps-script - 将 Google 表单响应映射或导出到 PDF 表单字段

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

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

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

我怎样才能做到这一点?

最佳答案

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

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

这是想法:

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

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

    Screenshot

  • 导出 XML 表单数据示例

    使用 Acrobat Reader(或类似工具),完整填写示例表单,并将表单数据导出为 XML。 (如果您使用将用于 HTML 模板的驼峰式术语填写表单,则可以简化后续步骤 - 例如 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 ?>
    

  • 表单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 问题。 (这是保持问题简短的一个很好的理由,并依靠帮助文本来详细说明!)

    Spreadsheet screenshot

    关于google-apps-script - 将 Google 表单响应映射或导出到 PDF 表单字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17795433/

    相关文章:

    google-apps-script - Google Apps 脚本在数组中查找值

    mysql - 将电子表格导出到 mySQL 的 Google Apps 脚本在多个文件上执行

    javascript - 使用 Google Apps 脚本制作已附加脚本的 Google 表单

    google-apps-script - 如何在 Google 表单问题中添加代码片段

    javascript - 如何从事件目标最接近(名称)中获取元素

    google-apps-script - 如何下载以前保存的Google Apps脚本修订版?

    google-apps-script - 对 bigquery.jobs.getQueryResults 的 API 调用失败,错误为 : Not found: Job

    java - 如何使用 Java 将 Google 文档(电子表格)设置为公开?

    javascript - 检查重复脚本

    google-apps-script - 获取条目 ID,用于在 Google 表单 URL 中预填充字段(项目)