如何以与表单中问题相同的顺序访问 Google 表单密钥对值

How to access Google Form key-pair values with the same order as the questions in the form

我在 Google Sheet 中使用以下 onSubmit(e) 脚本 运行 从 Google 表单提交中访问密钥对值。然后将它们放入 HTML 列表并通过电子邮件发送。到目前为止,一切都很好。每次提交表单时,我都会收到一封电子邮件通知,其中列有问题和答复。

问题:对的顺序是随机的,并且随着每次提交而改变。我希望它与表单上的问题顺序相同,从上到下。

这是基本的工作脚本(减去我的详细信息):

function onFormSubmit(e) {

var values = e.namedValues;
var sendFrom = '';
var ccEmail = '';
var subject = '';
var htmlBody = '<ul>';

for (Key in values) {
  var label = Key;
  var data = values[Key];
  htmlBody += '<li>' + label + ": " + data + '</li>';
};

htmlBody += '</ul>';
MailApp.sendEmail(sendFrom, subject, htmlBody, {
  htmlBody: htmlBody,
  cc: ccEmail,
  name: 'Automated Email',
  noReply: true
});
}

表格中的实际问题顺序(前 5 个问题):

下面是一个示例通知电子邮件,问题的顺序是随机的:

我猜 namedValues 对象是异步创建的还是什么?无论如何要锁定它以匹配表单上的顺序,或者首先访问表单上的问题顺序然后映射到它?显然不想在这里对键进行硬编码,在表单上进行一次编辑,它就坏了...

恐怕有点超出我的脚本编写水平。任何帮助表示赞赏!

这个问题 post 已经被别人 post 解决了两年,但 post 没有答案。

使用 e.values 数组而不是 e.namedValues 对象。在数组中,值的显示顺序与它们存储在电子表格中的顺序相同。要获取字段名称,请使用 SpreadsheetApp.getActive().getRange('Form Responses 1!A1:1').getValues()[0].

请参阅 event objects 帮助页面。

感谢 doubleunary 的解决方案。这是工作代码:

function onFormSubmit(e) {
//access the values only in original order
  var values = e.values;
  var vlen = values.length;
//access the headers from the response sheet (i.e. questions)
  var fields = SpreadsheetApp.getActive().getRange('sheetName!A2:K2').getValues()[0];
  var i;
  var htmlBody = '<ul>';
//loop through headers + values to build HTML list
  for (i=0;i<vlen;i++) {
    
    var label = fields[i];
    var data = values[i];
    htmlBody += '<li>' + label + ": " + data + '</li>';
    
  };
  
  htmlBody += '</ul>';
  var recipientsTO =  "someoneelse1@xyz"+","+"someoneelse2@xyz";
  
  MailApp.sendEmail({
    to:"me@xyz",
    bcc:recipientsTO,
    subject: "Language Division RIC",
    htmlBody: htmlBody
  })
}