簡體   English   中英

使用ECMAScript6收集響應並在Google表單中進行統計

[英]Collect responses and make stats in Google Forms with ECMAScript6

我正在使用腳本編輯器在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 ergo Google Script不支持ECMAScript6或者我做錯了事,可以嗎?

[UPDATE]

由於以下響應,這是有效的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 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腳本尚不能使用ECMAScript6。 因此,也無法使用Map.prototype.set()Map.prototype.get() 我修改了您的腳本,使其可以在Google Apps腳本中使用。 修改后的腳本可在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,為什么不加載polyfill?

最好的一種是core-js ,這是Babel用於所有ES6 +功能的一種。 您甚至可以僅定制所需功能的自定義版本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM