使用 ECMAScript6 在 Google 表单中收集回复并进行统计



我正在使用脚本编辑器在Google表单中收集调查结果。我的脚本如下所示:

function myFunction() {
  var formResponses = FormApp.getActiveForm().getResponses();
  var allResponses=[];
  for (var j = 0; j < formResponses.length; j++) {
    var formResponse = formResponses[j];
    var itemResponses = formResponse.getItemResponses();
    for (var i = 0; i < itemResponses.length; i++) {
      var itemResponse = itemResponses[i];
      allResponses.push( itemResponse.getResponse() );
    }
  }
  var jsonRes=JSON.stringify(allResponses);
  MailApp.sendEmail("noreply@mydomain.com", "Survey Results", jsonRes);
}

这工作得很好。现在我想添加一些统计数据,例如计算每个响应的结果数量。为此,我喜欢以简单的方式使用 ECMA6 Map,如下所示:

// flatten the array 
var words=allResponses.map(a => a.join(',')).join(',').split(',')
// map reduce and calculate occurrences of the map keys
var chart=[...words.reduce( (m, v) => m.set(v, (m.get(v) || 0) + 1), new Map() )].sort((a,b) => b[1]-a[1])
chart=chart.map(function(i) { return i.join(",")})
chart=chart.map(function(item,index) { return ((index+1)+","+item)})
var jsonRes=JSON.stringify(chart);

这将输出我的响应列表,例如

[
"1,responseA,1024",
"2,responseA,956",
"3,responseA,433"
]

等。

出乎意料的是,这将导致Google脚本编辑器出错,所以我虽然是ECMA6箭头运算符,所以我已经移回了功能:

var words=allResponses.map(function(a) { return a.join(',') } ).join(',').split(',');
  var map=words.reduce(function(m,v) { return m.set(v, (m.get(v) || 0) + 1)}, new Map() );
  // convert back Map entries to Array
  var chart = Array.from(map.entries());
  chart.sort(function(a,b){ return (b[1]-a[1])});
  var jsonRes=JSON.stringify(chart);

有趣的故事:Map对象是undefined尔格谷歌脚本不支持ECMAScript6或者我做错了什么,是吗?

[更新]

这是有效的谷歌脚本解决方案,这要归功于以下响应:

function myFunction() {
  var formResponses = FormApp.getActiveForm().getResponses();
  var allResponses=[];
  for (var j = 0; j < formResponses.length; j++) {
    var formResponse = formResponses[j];
    var itemResponses = formResponse.getItemResponses();
    for (var i = 0; i < itemResponses.length; i++) {
      var itemResponse = itemResponses[i];
      allResponses.push( itemResponse.getResponse() );
    }
  }
  var words=allResponses.map(function(a) { return a.join(',') }).join(',').split(',');
  var chart = words.reduce(function(m,v) {m[v] = m[v] ? m[v] + 1 : 1; return m;}, {}); // Added
  chart = Object.keys(chart).map(function(k) {return [k, chart[k]]}).sort(function(a,b) {return b[1]-a[1]}); // Added
  chart=chart.map(function(i) { return i.join(",")})
  chart=chart.map(function(item,index) { return ((index+1)+","+item)})
  var jsonRes=JSON.stringify(chart);
  MailApp.sendEmail("noreply@mydomain.com", "Survey Results", jsonRes);
}

这个样本怎么样?Google Apps Script 还不能使用 ECMAScript6。所以Map.prototype.set()Map.prototype.get()也不能使用。我修改了您的脚本,以便能够在Google Apps Script上使用。修改后的脚本在 GAS 中工作。

从:

var chart=[...words.reduce( (m, v) => m.set(v, (m.get(v) || 0) + 1), new Map() )].sort((a,b) => b[1]-a[1])
chart=chart.map(function(i) { return i.join(",")})
chart=chart.map(function(item,index) { return ((index+1)+","+item)})
var jsonRes=JSON.stringify(chart);

自:

var chart = words.reduce(function(m,v) {m[v] = m[v] ? m[v] + 1 : 1; return m;}, {}); // Added
chart = Object.keys(chart).map(function(k) {return [k, chart[k]]}).sort(function(a,b) {return b[1]-a[1]}); // Added
chart=chart.map(function(i) { return i.join(",")})
chart=chart.map(function(item,index) { return ((index+1)+","+item)})
var jsonRes=JSON.stringify(chart);

JSFIDDLE 示例

我不知道这是否是最好的修改。由于我不知道原始数据,如果这对您没有用,我很抱歉。

如果你真的需要一张地图,并且不能使用 POJO,为什么不加载一个填充物呢?

最好的一个是core-js这是Babel用于所有ES6 +功能的一个。您甚至可以仅对所需的功能进行自定义构建

最新更新