google-apps-script - 表单上的应用程序脚本如何将额外数据存储到工作表中?

标签 google-apps-script google-forms

问:附加到表单的 AppsScript 如何将额外的数据存储到工作表中?

情况:我们有一个(长)谷歌表单,它将许多数据存储到一个谷歌表格中。通常需要编辑条目,并且使用原始表单进行编辑比尝试直接在工作表中进行编辑要容易得多。 (其中一些项目是文本,有几段长。)我想在电子表格中存储一条额外的数据,特别是编辑器可以用来使用表单编辑行条目的 URL。

我已经可以获取所有表单数据,并且可以使用 formResponse.getEditResponseUrl() 获取正确的 URL。我可以将所有这些通过电子邮件发送给用户,通常是收集所有表单条目的编辑。 (感谢 StackOverflow 中的许多有用答案让我走到了这一步!)但是编辑器必须手动将 URL 复制并粘贴到电子表格适当行中的附加列中。

我在 Sheet 类中看到了一个向电子表格添加列的界面,但我看不到如何为表单刚刚存储的特定行填充额外的列。我们已经手动添加了该列,并验证了在通过表单进行编辑时它没有被 Google 覆盖。如何将一小段数据存储到工作表中?

我错过了什么?任何帮助将不胜感激。谢谢。

[补充说明 2015-02-06]

  • 我们有一个很长的表格,有些人提交,其他人编辑。编辑将使用表单完成,而不是直接在电子表格中进行编辑,因此我们需要允许编辑者重新编辑响应的 URL。
  • 我想在表单提交期间将该 URL 存储到电子表格中,以便有权访问工作表的编辑者可以找到它。
  • 在表单端的脚本中,我可以轻松计算该 URL,但现在如何将其存储到工作表中的额外列中?
  • 目前,在我的表单端脚本中,我获取 URL 并将其与所有表单数据一起通过电子邮件发送到编辑的分发列表。然后,其中一位编辑从电子邮件中复制 URL 并将其粘贴到工作表中。 (大多数情况下,进入正确的行,甚至。:-) 这是一个可能容易出错的手动步骤。)
  • 第二个问题:工作表中的行号与 form.getResponses() 中的响应号有何不同?行号和响应号似乎随着新项目的提交(即新行)和旧项目的编辑而变化。可以合理地预测编辑器将在其中找到表单数据的工作表行号吗?

  • 再次感谢您在这方面给我的任何帮助。我们有一个可行的临时解决方案。然而,在接下来的几个月里,会有大约一百个表单条目出现,我希望尽可能地对这个过程进行防错。

    瑞克

    最佳答案

    所以,我刚刚偶然发现了你的问题,希望我理解正确。

    可能出现的问题:

  • 脚本被错误地绑定(bind)到附加到表单的电子表格而不是表单本身(据我从您的描述中了解到,这不是您的问题)
  • 提交插入和附加列编辑之间或同时提交之间的竞争条件(参见代码中的第 27-32 行)
  • 直接访问电子表格,无需事先从电子表格中选择工作表,即使该电子表格仅包含一张工作表! (见代码第 36-37 行)
  • 使用列数字索引,而不是相应的列字母作为 getRange() 方法的参数,该方法仅接受列字母 AFAIK(参见代码中的第 42-43 行)

  • 下面你有应该解决所有这些问题的代码(我没有测试过,但它是一个非常相似的场景的完美工作解决方案的改编):
    // Converts sheet column numeric index to corresponding column letter
    function columnToLetter(column)
    {
      var temp, letter = '';
      while (column > 0)
      {
        temp = (column - 1) % 26;
        letter = String.fromCharCode(temp + 65) + letter;
        column = (column - temp - 1) / 26;
      }
      return letter;
    }
    

    以下功能必须从表单注册到“表单提交”事件 - 而不是电子表格! (脚本工具栏 -> 资源 -> 当前项目的触发器 -> 添加新触发器)
    // Associated the sheet rows with response URLs in an additional column
    function onFormSubmit(e)
    {
      try
      {
        // Get the response Url, either from FormApp:
        var responseUrl = FormApp.getActiveForm().getEditResponseUrl();
        // Or alternatively get it from the event:
    //  var responseUrl e.response.getId().getEditResponseUrl();
        // ....................
        // Other URL processing
        // ....................
    
        // Get a public lock on this script, because we're about to modify a shared resource.
        var lock = LockService.getPublicLock();
        // Wait for up to 30 seconds for other processes to finish.
        lock.waitLock(30000);
        // Wait for row insertion to finish, so that sheet.getLastRow() method gets the updated number of rows
        Utilities.sleep(1000); // 1 second
    
        // Here insert the URL to your spreadsheet
        var spreadsheetUrl = "https://docs.google.com/spreadsheets/d/YGUgHi28_gYUffGYGGH_78hkO1Pk/edit";
        // Gets the first sheet inside the spreadsheet (if you have multiple sheets, just change the value [0])
        var sheet = SpreadsheetApp.openByUrl(spreadsheetUrl).getSheets()[0];
        // Get updated number of rows and columns, after form submit inserted the new row
        var lastRow = sheet.getLastRow();
        var lastColumn = sheet.getLastColumn();
    
        // Get the exact cell, next to the right of the new row, by converting the column index to corresponding letter
        var lastCell = columnToLetter(lastColumn) + lastRow.toString();
        // Set the content of the cell with the new URL
        sheet.getRange(lastCell).setValue(responseUrl);
    
        // Release the lock so that other processes can continue.
        lock.releaseLock();    
      }
      catch (error)
      {
        // If there's an error, show the error message
        return error.toString();
      }
    }
    

    对于任何其他问题,只需写评论。希望能帮助到你。

    关于google-apps-script - 表单上的应用程序脚本如何将额外数据存储到工作表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28143036/

    相关文章:

    PHP 到 MySQL 和 Google 表格?

    javascript - 当尝试在 Google Sheet 脚本中使用 e.value 时,我得到 TypeError : Cannot read property "Values" from undefined. (第 7 行,文件 "Code")

    javascript - 为 'on form submit' 触发器指定表单

    javascript - 将HTML Table中的信息拆分并与 "header"信息合并

    javascript - 为什么我不能使用 Google Apps 脚本对包含空格的字符串执行 .split() ?

    google-sheets-api - 提交 Google 表单时向移动设备推送通知

    javascript - 如何在 Google Apps 脚本 HTMLService 中设置链接? (错误与accounts.google.com的连接被取消)

    javascript - 使用 Google 脚本编辑器添加到电子表格

    forms - 来自银行的谷歌表格随机问题,每次打开表格时都不同