0

我在 Google 电子表格中使用应用程序脚本来使用表单执行多项操作。

编辑:对于像我这样的视觉人士:https ://docs.google.com/file/d/0B0dOXR40dAVgNk1MVkZjdjFDLW8/edit?usp=sharing

  1. 电子表格首先根据目标工作表中特定单元格的值创建表单。这意味着它用与用户指定的那些单元格匹配的项目填充新创建的表单。

  2. 然后,电子表格将新创建的表单连接到自身,因此发送到表单的响应也会发送到电子表格。通过这样做,将在电子表格中创建一个新工作表来包含这些响应。

  3. 然后,用户可以请求电子表格生成 URL。此 URL 以表单为目标,但基于目标表中已填写的内容。必须生成 URL,因为这是为表单中的项目预填充值的唯一方法。

  4. 新生成的 URL 后面跟着另一个用户。URL 将它们带到表单,但它包含由生成 URL 的电子表格定义的那些预填充值。

  5. 其他用户可以编辑表单的这些值并点击提交。响应被发送到表单,然后将其发送到电子表格以填充为包含这些响应而创建的工作表的最底部行。

  6. 触发器被激活(称为 onFormSubmit),然后获取最上面一行的值(就在包含列标签的行的下方)并立即删除该行。然后,电子表格使用这些值来填写目标工作表单元格的值 - 与第 3 步中用于生成该 URL 的值相同。

    • 澄清一下,所有这一切的重点是在不值得信任的用户(如果没有的话,被授予编辑电子表格的权限的用户基本上能够访问一切,包括脚本!)和用户之间建立安全连接拥有电子表格。然后,拥有电子表格的用户可以通过编程方式限制不可信用户可以通过这种方式在电子表格上编辑的内容。

    • 就在这一点之后,事情开始出错了......

  7. 根据提交的响应编辑目标工作表后,必须生成一个新 URL 以包含那些新更新的值。用户必须再次请求电子表格生成一个替换旧 URL 的 URL。

    • 由于某种原因,这不会发生。它曾经工作得很好,但由于某种原因,现在它在解析表单中的第一个项目时崩溃了。

执行成绩单:

[13-08-26 10:10:33:779 EDT] Starting execution
[13-08-26 10:10:33:799 EDT] SpreadsheetApp.getActiveSpreadsheet() [0 seconds]
[13-08-26 10:10:33:950 EDT] Spreadsheet.getSheetByName([**REDACTED**]) [0.15 seconds]
[13-08-26 10:10:33:950 EDT] Sheet.getRange([B11:L68]) [0 seconds]
[13-08-26 10:10:33:969 EDT] Spreadsheet.getSheetByName([Element Types]) [0.018 seconds]
[13-08-26 10:10:33:988 EDT] Spreadsheet.getSheetByName([Due Date Last Checked]) [0.018 seconds]
[13-08-26 10:10:33:988 EDT] Sheet.getRange([1, 5]) [0 seconds]
[13-08-26 10:10:33:989 EDT] Range.setFormula([]) [0 seconds]
[13-08-26 10:10:33:989 EDT] Range.setFormula([=NOW()]) [0 seconds]
[13-08-26 10:10:34:173 EDT] Range.getValue() [0.183 seconds]
[13-08-26 10:10:34:420 EDT] DriveApp.getFolderById([**REDACTED**]) [0.247 seconds]
[13-08-26 10:10:34:420 EDT] SpreadsheetApp.getActiveSpreadsheet() [0 seconds]
[13-08-26 10:10:34:429 EDT] Spreadsheet.getName() [0.008 seconds]
[13-08-26 10:10:34:429 EDT] Folder.getFilesByName([**REDACTED**]) [0 seconds]
[13-08-26 10:10:35:018 EDT] (class).hasNext() [0.588 seconds]
[13-08-26 10:10:35:018 EDT] (class).next() [0 seconds]
[13-08-26 10:10:35:027 EDT] File.getId() [0 seconds]
[13-08-26 10:10:35:249 EDT] FormApp.openById([**REDACTED**]) [0.221 seconds]
[13-08-26 10:10:35:336 EDT] Form.getItems() [0.083 seconds]
[13-08-26 10:10:35:381 EDT] Form.createResponse() [0.039 seconds]
[13-08-26 10:10:35:398 EDT] Spreadsheet.getSheetByName([Cover Sheet]) [0.009 seconds]
[13-08-26 10:10:35:398 EDT] Sheet.getRange([G26]) [0 seconds]
[13-08-26 10:10:35:410 EDT] Range.getValue() [0.011 seconds]
[13-08-26 10:10:35:411 EDT] Item.toString() [0 seconds]
[13-08-26 10:10:35:572 EDT] Execution failed: TypeError: Cannot find function asParagraghTextItem in object Item. (line 82, file "Form Scripts") [1.653 seconds total runtime]

此脚本中导致崩溃的代码块如下所示:

var form = FormApp.openById(forms.next().getId());
var items = form.getItems();
var form_response = form.createResponse();

var item = items[0];
//Logger.log(item_i+","+"expected ParagraphTextItem: "+item.getType());
var comment = spreadsheet.getSheetByName("Cover Sheet").getRange("G26").getValue();
if(comment){
  //THIS LINE BELOW ME IS THE LINE THAT'S CAUSING THE CRASH
  var response = item.asParagraghTextItem().createResponse(comment);
  form_response.withItemResponse(response);
}

所以!如果我重新运行此脚本,但使用带有 Logger 内容的行(已注释掉的行),我们会在日志中得到这个:

[13-08-26 10:35:15:225 EDT] undefined,expected ParagraphTextItem: PARAGRAPH_TEXT

这很奇怪,因为崩溃是由该项目引起的,显然不是 ParagraghTextItem 类型。

有任何想法吗?希望 Google 的某个人注意到这一点,因为我相当确定这是一个编码器的错误,而不是我的一些错误代码导致的运行时错误(尽管我可能在这里犯了错误,在这种情况下意识到这一点后,我将获得健康的谦逊)。

4

1 回答 1

1

请更正您的错字:没有名为asParagraghTextItem. 我想你的意思是asParagraphTextItem相反。

于 2013-08-26T15:49:50.177 回答