将Google表单回复映射或导出到PDF表单字段

时间:2013-07-22 19:06:08

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

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

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

我该如何实现?

1 个答案:

答案 0 :(得分:1)

有一篇关于patentbytes.com的文章Automatically Completing Your PDF Forms,该文章详细介绍了这个主题,这是这个答案的灵感来源。

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

以下是这个想法:

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

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

      Screenshot

    导出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>
    

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

    Form&amp;电子表格

    触发器函数处理的eventData对象中的namedValues来自“表单响应”表,它直接来自“表单”问题。 (这是保持问题简短的一个很好的理由,并依靠帮助文本来详细说明!)

    Spreadsheet screenshot