繁体   English   中英

如何从Google表单提交触发功能访问电子表格

[英]How to access Spreadsheet from a Google Forms submit trigger function

我在Google Forms脚本中有一个函数,可以向要添加到关联工作表的行中添加唯一ID。 提交表单后触发此功能。

这是我一直在玩的脚本的一个版本:

function onFormSubmit(e) {
  // Get the active sheet
  var sheet = SpreadsheetApp.getActiveSheet();
  // Get the active row
  var row = sheet.getActiveCell().getRowIndex();
  // Get the next ID value.  
  var id = sheet.getRange("Z4").getValue();
  // Check of ID column is empty
  if (sheet.getRange(row, 1).getValue() == "") {
    // Set new ID value
    sheet.getRange(row, 1).setValue(id);
    sheet.getRange("Z4").setValue("Z4"+1)
  }
}

在调试时,我收到消息:

TypeError:无法调用null的方法“ getActiveCell”。 (第5行,文件“ CreateID”)

我尝试将代码裁剪为一个简单的setValue ,并且遇到相同的问题-“无法调用方法...”,除了getActiveSheet之外,几乎所有行都存在。

该函数的触发器工作正常,因为我收到通知以告知该函数本身未能成功执行。 我在网上看过,尝试过一些方法,但目前找不到解决方案。

因此,我真正想要的是访问表单发布到的电子表格的正确方法。 如果SpreadsheetApp.getActiveSheet()不是正确的方法,那是什么?

抱歉,此脚本是全新的,上一次在PLI(!)中编程。 指向现有解决方案或其他解决方案的任何指针,将不胜感激。

提交表单时,触发器功能没有活动的电子表格,也没有活动的单元格。 (它与Sheets UI没有关联,因此这些概念毫无意义。)

但是,事件参数e将提供有关已由Form添加的行的信息。 查看Google表格事件

截图

e.range包含一个Range对象,该对象覆盖触发您的函数的表单提交所填充的单元格。 您可以从那里回溯以获取工作表。

sheet = e.range.getSheet();

您的功能将变成这样:

function onFormSubmit(e) {
  // Get the active sheet
  var sheet = e.range.getSheet();
  // Get the active row
  var row = e.range.getRowIndex();
  // Get the next ID value.  
  var id = sheet.getRange("Z4").getValue();
  // Check of ID column is empty
  if (sheet.getRange(row, 1).getValue() == "") {
    // Set new ID value
    sheet.getRange(row, 1).setValue(id);
    sheet.getRange("Z4").setValue("Z4"+1)
  }
}

现在,您还有其他问题要处理。

  • sheet.getRange(row, 1).getValue()不是必需的; 该值刚刚作为e.values[0]传递给您。

  • 但是,在提交表单时,第一列包含时间戳记,因此永远不会为空。 如果您的“ ID”值是表单上的第一个问题,那么它实际上在第2列或e.values[1]

  • 随着表单提交将新行插入到工作表中,单元格Z4可能会继续向您移动。 最好从另一个工作表中获取该值,或者最好还是使用Properties Service对其进行管理。

要利用事件,您需要对其进行仿真以进行测试。 阅读全文如何在GAS中测试触发功能?

您需要检查getActiveSheet()是否成功。

function onFormSubmit(e) {
  // Get the active sheet
  var sheet = SpreadsheetApp.getActiveSheet();
  if (!sheet) { // No active sheet, nothing to do
    return;
  }
  // Get the active row
  var row = sheet.getActiveCell().getRowIndex();
  // Get the next ID value.  
  var id = sheet.getRange("Z4").getValue();
  // Check of ID column is empty
  if (sheet.getRange(row, 1).getValue() == "") {
    // Set new ID value
    sheet.getRange(row, 1).setValue(id);
    sheet.getRange("Z4").setValue("Z4"+1)
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM