使用 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
因此 Google 脚本不支持 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 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);
不知道这是不是最好的修改。由于我不知道原始数据,如果这对你没有用,我很抱歉。
如果你真的需要一个地图,而不能使用 POJO,为什么不加载一个 polyfill?
最好的是 core-js
,这是 Babel 用于所有 ES6+ 功能的一个。您甚至可以只定制您想要的功能
我正在使用脚本编辑器在 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
因此 Google 脚本不支持 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 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);
不知道这是不是最好的修改。由于我不知道原始数据,如果这对你没有用,我很抱歉。
如果你真的需要一个地图,而不能使用 POJO,为什么不加载一个 polyfill?
最好的是 core-js
,这是 Babel 用于所有 ES6+ 功能的一个。您甚至可以只定制您想要的功能