【问题标题】:Calling FormApp within doGet(e) function在 doGet(e) 函数中调用 FormApp
【发布时间】:2015-08-19 02:39:15
【问题描述】:

我对脚本比较陌生,所以请善待。

我正在尝试创建一个绑定到 Google Apps 中的表单的函数,包括一个 webapp,它捕获 3 个变量(requestNum、approverNum 和 status)并从 FormApp 获取各种其他信息(例如标题、响应等)。

我收到 - TypeError: Cannot call method "getId" of null 在下面代码的第 3 行(绑定到表单)。

非常感谢能够从 doGet 函数中调用表单信息的任何指导!谢谢你。

  function doGet(e){
  var form = FormApp.getActiveForm();
  var formId = form.getId();
  var items = form.getItems();
  var d = new Date();
  var formattedDate = Utilities.formatDate(d, "GMT+11", "MMM dd yyyy");
  var conn = Jdbc.getConnection(dbUrl, user, userPwd);

  var stmt = conn.prepareStatement('INSERT INTO approvals '
      + '(formId, requestNum, approverNum, status, date) values (?, ?, ?, ?, ?)');
  stmt.setString(1, formId);
  stmt.setString(2, e.parameter.requestNum);
  stmt.setString(3, e.parameter.approverNum);
  stmt.setString(4, e.parameter.status);
  stmt.setString(5, d);
  stmt.execute();

  var nextApproverNum = e.parameter.approverNum + 1;
  var answer = e.parameter.status;
  var requestNum = e.parameter.requestNum;
  var nextApproverEmail = e.parameter.reply;

  var titles = [];
  for (i=0; i<items.length; i++) {
  titles.push(items[i].getTitle());
  }

  var responses = [];
  var formResponses = form.getResponses();
  var itemResponses = formResponses[requestNum-1].getItemResponses();
    for (var j = 0; j < itemResponses.length; j++) {
    responses.push(itemResponses[j].getResponse());
  }
  ....etc

【问题讨论】:

  • here 所写,getId() 仅在脚本绑定到容器的表单时才有效。换句话说,这只适用于您在表单中创建脚本,而不是在单独的脚本或响应表中。
  • 如果您的脚本是以这种形式创建的,请尝试分别运行代码的前三行。
  • @AkshinJalilov - 理解脚本必须绑定到表单 - 它当前驻留在表单脚本中。我已经测试过手动运行这三行代码,它可以正常工作。 使用 webapp 运行函数时会出现问题(我将设置设置为“以我身份执行应用程序”和“任何人都可以访问,包括匿名”。我需要来自用户的数据,这我通过一个链接获取 - 因此它需要通过 webapp 运行它的原因。非常感谢您的想法。
  • 由于它似乎不适用于 webapp,我尝试稍微修改代码以捕获链接中的 formId,以便运行 openById(e.parameter.formId)。但是现在我收到错误:您无权调用 openById
  • 最坏的情况我可以将表单标题和响应发送到外部数据库并从那里提取,但在这种情况下不希望。

标签: google-apps-script google-forms


【解决方案1】:

在正确的访问条件下,您遇到问题的代码可以正常工作。您应该查看用于发布为 Web 应用程序的设置。

这个 sn-p 只关注您提出的问题,它按预期工作:

function doGet(e){
//  var form = FormApp.getActiveForm(); // TypeError: Cannot call method "getId" of null.
  var form = FormApp.openById('17lTBrLmQxggVADlnPC6DgTZf1f2sCEA1Rc9ZIpBu_uQ');
  var formId = form.getId();
  var items = form.getItems();
  return ContentService.createTextOutput("Form contains "+items.length+"items.");
}

【讨论】:

  • 原来我在早期脚本的代码中隐藏了“@OnlyCurrentDoc”。为疏忽道歉。
猜你喜欢
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2020-10-31
相关资源
最近更新 更多