【问题标题】:How to collect data from form entries when editing a previously submitted form using Google Apps Script?使用 Google Apps 脚本编辑以前提交的表单时如何从表单条目中收集数据?
【发布时间】:2021-02-10 17:49:24
【问题描述】:

我有一个 Google 表单,允许用户编辑之前提交的回复。第一次提交表单时,我将时间戳、序列号和技术捕获为变量,并将它们作为聊天通知推送到松弛通道,同时将所有响应写入电子表格。我正在为该函数使用 onFormSubmit 触发器。这部分效果很好。

有些字段不是必需的,但稍后通过编辑表单响应来填写。编辑和提交表单时,序列号和技术字段不会更改。电子表格会相应更新,但对于松弛通道通知,唯一具有数据的变量是时间戳。由于表单上的这些字段未更改,因此序列号和技术为空白。如何使用我的 slack 通知的预先存在的表单响应为序列和技术创建变量?

我当前的代码检查技术值是否为空,如果不为空,它会发送一个松弛通知。如果它是空白的,它什么也不做。如果它是空白的,我希望它将现有的表单响应捕获为一个数组,我可以使用这些值来创建一个显示相同数据的松弛通知,但包括原始表单已使用预先存在的值重新提交.

我是编码新手,已经研究和测试了一个多星期,但没有任何结果。

var timestamp = 'Timestamp'                         //type exact column header as shown in workbook
var tech = 'Troubleshooting Tech'                   //type exact column header as shown in workbook
var parts = 'Part(s)#  Ordered'                     //type exact column header as shown in workbook
var serial = 'Serial #'                             //type exact column header as shown in workbook
var slackWebHook = ''    //Paste Slack webhook here
function SendSlackMessageEvent(e) {
  const ss = SpreadsheetApp.getActive();
  let data = e.namedValues
  let payload = buildAlert(data);

      if (data[tech] == '') {

    }
  if (data[tech] != '') {
  sendAlert(payload);
}
}

function buildAlert(data) {
  let timestampe = data[timestamp];
  let teche = data[tech];
  let seriale = data[serial];
  let partse = data[parts];

  let payload = {
    "blocks": [
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": ":bell: *Breakfix Ticket Submitted* :bell:"
        }
      },
      {
        "type": "divider"
      },
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": teche + " submitted a ticket on " + timestampe
        }
      },
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": "Serial #: " + seriale
        }
      },
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": "Parts Needed: " + partse
        }
      }
    ]
  };
  return payload;
}

function sendAlert(payload) {
 // const webhook = ""; //Paste your webhook URL here
  const webhook = slackWebHook; //slack webhook URL
  var options = {
    "method": "post", 
    "contentType": "application/json", 
    "muteHttpExceptions": true, 
    "payload": JSON.stringify(payload) 
  };
  
  try {
    UrlFetchApp.fetch(webhook, options);
  } catch(e) {
    Logger.log(e);
  }
}

【问题讨论】:

  • 欢迎来到Stack Overflow。您的代码是否完整(tech 未声明)?
  • 我在代码中添加了声明。我没有使用数据 [1] 之类的时间戳作为索引,而是使用电子表格中的标题。

标签: javascript arrays google-apps-script google-sheets google-forms


【解决方案1】:

您的代码中的问题是您假设未更改的响应将作为空字符串包含在namedValues 属性中,但它不会包含在内:

data[tech] 将返回 undefined

代替

 if (data[tech] == '') {

    }
  if (data[tech] != '') {
  sendAlert(payload);
}

你可能会使用

if(data[tech]){
  // add here what should be done when data[tech] has a value

} else {
  // add here what should be done when data[tech] is undefined

}

另一方面,由于表单提交事件对象包含一个具有响应对应范围的范围属性,您可以使用它来代替 namedValues 属性:

e.range.getValues() return Array 包含一个包含电子表格中记录的值的数组。

相关

参考

【讨论】:

  • if (data[tech] == '') 确实返回 true 而不是未定义。当它什么都没有返回时,我希望它从电子表格中提取数据以获取该表单响应,但我不知道该怎么做。我试过e.range.getValues(),但记录器显示[FormResponse, FormResponse, FormResponse, FormResponse, FormResponse, FormResponse, FormResponse, FormResponse]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
相关资源
最近更新 更多