【问题标题】:Saving data from Google Spreadsheet into an Array将 Google 电子表格中的数据保存到数组中
【发布时间】:2019-11-11 15:53:05
【问题描述】:
for(var i=0; i<sheet.getMaxColumns(); i++){
   var params[i] = e.values[i]; 
  }

console.log(params);

for(var z=0; z<paramsInfo.length; z++){
    var paramsInfoCheck = paramsInfo[z];


    var template = HtmlService.createTemplateFromFile(paramsInfoCheck.name);
    template[paramsInfoCheck.name] = params[paramsInfoCheck.number];
    template.recorded = params[51];
    template.remarks = params[52];

    if((params[paramsInfoCheck.number] < paramsInfoCheck.min) || (params[paramsInfoCheck.number] > paramsInfoCheck.max)){

      MailApp.sendEmail(recipients,
    "Parameter Out of Range Notification",
     "",{htmlBody: template.evaluate().getContent() + spreadsheetlink});
     }
    }

如图所示,当我只有 1 个 console.log 时,它运行了 2 个 console.log,第一个日志捕获了这些值,而第二个没有。

  • “测试”后忽略空值 - 因为这些值不应该被捕获,因此它是空值,因为表单上没有任何内容。

目前我有一个表格用来收集一些数据。它有超过 50 列。 如果键入的某些值不在范围内,我还有另一个for loopif loop 用于发送电子邮件。我使用了onFormSubmit 事件触发器。

当我console.log 我的值数组时。有些值是null,但在电子表格中有特定列号的值。 我假设由于数据量大,程序没有足够的时间来处理它以放入数组并运行MailApp 函数。有人遇到过这种情况吗?

我的执行日志显示已完成且没有错误,但缺少某些值,或者更确切地说是null

【问题讨论】:

  • 您的问题很难理解,并且您的代码 sn-p 中没有console.log(),因此似乎缺少最重要的部分。请查看并澄清。
  • 对不起,我错过了console.log()。我已经编辑了代码。基本上,我只有 1 个console.log,但是在我的执行日志中,第一次执行捕获了我的所有值,但在第二次执行时,它显示为空白。如前所述,在“测试”之后忽略空值,因为它们是我手动添加的附加列以供自己参考。 @迭戈

标签: google-apps-script


【解决方案1】:

因为您写道,它执行了两次,第二次使用空数据,这听起来像是onFormSubmit() 触发器运行两次的问题。这似乎是一个 Apps 脚本错误,但 Stack Overflow 用户 J.G.Cooper 提供了一个有用的 workaround:检查所需问题的值。因此,只需在开头包含if (e.values &amp;&amp; !e.values[1]) { return; },它应该可以防止额外的执行。

function onFormSubmit(e) {

  // Reject spurious triggers by checking the value of a required question.
  // In this case, we assume  e.value[1] is required.
  if (e.values && !e.values[1]) { return; }

  var sheet = e.range.getSheet(); // Assuming this is how you defined sheet

  // This is your original code
  for (var i = 0; i < sheet.getMaxColumns(); i++) {
    var params[i] = e.values[i]; 
  }

  console.log(params);

  for (var z = 0; z < paramsInfo.length; z++) {
    var paramsInfoCheck = paramsInfo[z];
    var template = HtmlService.createTemplateFromFile(paramsInfoCheck.name);
    template[paramsInfoCheck.name] = params[paramsInfoCheck.number];
    template.recorded = params[51];
    template.remarks = params[52];

    if ((params[paramsInfoCheck.number] < paramsInfoCheck.min) || (params[paramsInfoCheck.number] > paramsInfoCheck.max)) {
      MailApp.sendEmail(recipients, "Parameter Out of Range Notification", "",{htmlBody: template.evaluate().getContent() + spreadsheetlink});
    }
  }
}

【讨论】:

  • 必填问题是否必须是表格中的合法必填问题?或者我们可以假设任何问题都是必需的吗? @迭戈
  • @D3FTY 这应该是一个合法的必填问题,但这并不意味着应该需要 first 问题(如我的回答)。如果表单中的问题不是必需的,并且有人在未回答该问题的情况下提交,那么您的触发器将跳过该响应。
  • 明白了。我会尝试一下,并在此处正确获取所需的问题并进行更新。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
相关资源
最近更新 更多