【问题标题】:Extract portions of Google Docs form data and write it on separate lines提取部分 Google Docs 表单数据并将其写入单独的行
【发布时间】:2013-04-10 16:55:04
【问题描述】:

假设我有一个收集以下信息的 Google 文档表单:

  • 时间戳(默认字段)
  • 名字
  • 参考#

然后表单数据在电子表格中显示如下:

4/10/2013 16:20:31  |  Jack, Jill, Oscar  |  Ref6656X

(注意:名称的数量可以是从 1 到多个)

我需要数据显示在电子表格中,如下所示:

4/10/2013 16:20:31  |  Jack  |  Ref6656X
4/10/2013 16:20:31  |  Jill  |  Ref6656X
4/10/2013 16:20:31  |  Oscar |  Ref6656X

我经常可以破译和编辑 Google Apps 脚本(JavaScript?),但我不知道如何用这种语言思考以便为自己创建它(尤其是名称字段中的名称数量未知)。我该如何着手解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    首先,在开始编写代码之前,您需要做出一些选择。

    • 您要修改接受表单输入的电子表格,还是生成包含修改后数据的单独工作表?如果您想记录用户实际输入的内容,最好不要管原始数据。如果您为按摩输出使用第二张工作表,则多个选项卡的存在可能会让您的用户感到困惑,除非您采取措施将其隐藏。

    • 您是想在表单进入时进行修改,还是在之后的某个时间(批量)进行修改?如果您已经收集了数据,则必须进行批量处理,这将涉及循环并必须在中间处理新行的插入。要处理传入的表单,您需要设置一个由表单提交触发的函数,并且只会将表格进一步向下扩展......但您还有更多学习要做 - 请参阅Container-Specific Triggers,@ 987654322@ 和 Understanding Events 了解背景信息。

    • 您将主要使用电子表格服务函数还是 javascript 数组?这种选择通常与速度有关 - 您可以在 javascript 中执行的操作越多,您的脚本就会越快,但在两者之间切换一开始可能会让人感到困惑。

    这是一个执行批量处理的示例函数。它将所有现有数据读入一个数组,遍历该数组并将所有行复制到一个新数组中,将多个名称扩展为多行。完成后,现有的工作表数据将被覆盖。 (注意 - 未经调试或测试。)

    function bulkProcess() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var dataIn = ss.getDataRange().getValues();
      var dataOut = [];
    
      for (var row in dataIn) {   // Could use:  for (var row = 0; row < dataIn.length; row++)
        var names = dataIn[row][1].split(','); // array of names in second column
        var rowOut = dataIn[row];
        for (var i in names) {
          rowOut[1] = names[i];  // overwrite with single name
          dataOut.push(rowOut);  // then copy to dataOut array
        }
      }
      // Write the updated array back to spreadsheet, overwriting existing values.
      ss.getRange(1,1,dataOut.length,dataOut[0].length).setValues(dataOut);
    }
    

    【讨论】:

    • 我已经听天由命地意识到这个问题在这里只会被搁置,所以这是一个惊喜!至于选择#1,我计划将所有表单数据捕获到镜像电子表格中,因为我不想操纵实时的实际数据。至于多个选项卡的存在/外观,在这种特殊情况下将不是问题。 (更多关注)
    • 至于选择#2,我最初的计划是在最新数据到达后立即处理(通过提交表单)。但是,如果同时(或几乎同时)发生 2 个或更多提交,我不确定该触发器的行为方式。因此,我打算测试一下批量处理所有表单提交需要多长时间。然而,我对此的主要担忧是,我需要保持刷新数据以在用户页面上查看,而我早期使用 Google Docs 的经验表明它相当缓慢。
    • 也就是说,您现在已经启发了我在使用工作表函数与 Javascript 处理时的速度/效率。就个人而言,我更喜欢编写所有代码,但 Javascript 对我来说还是个新手,所以到目前为止,我一直尽可能地依赖电子表格功能。
    • 查看What is faster: ScriptDb or SpreadsheetApp?,以评估许多 I/O 选项。只要有可能,(a) 使用数组和 (b) 批量写入电子表格。
    • 您的解释和示例已被证明对我来说是无价的,所以虽然我仍在为这个解决方案构建不同的元素,但我的问题的唯一“真实答案”将很大程度上取决于您在此处的输入(和其他地方)。因此,我将继续接受您的回答作为解决方案。 (当我完全完成后,我会将最终编译发布到我的原始帖子的编辑中)。再次感谢您的所有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多