My google script which based on Google Sheet and Form
My google script which based on Google Sheet and Form
// get sheet data
function getSpreadsheetData(sheetId) {
// This function gives you an array of objects modeling a worksheet's tabular data, where the first items — column headers — become the property names.
var arrayOfArrays = SpreadsheetApp.openById(sheetId).getDataRange().getValues();
var headers = arrayOfArrays.shift();
return arrayOfArrays.map(function(row) {
return row.reduce(function(memo, value, index) {
if (value) {
memo[headers[index]] = value;
}
return memo;
}, {});
});
}
// class definition
function instance(appName, url, oldLineNum, newLineNum, importedLibrary, author) {
var o = new Object();
o.appName = appName;
o.url = url;
o.oldLineNum = oldLineNum;
o.newLineNum = newLineNum;
o.importedLibrary = importedLibrary;
o.author = author;
return o;
}
function getInstFromRow(row) {
return new instance(row['appName'], row['url'], row['oldLineNum'], row['newLineNum'], row['importedLibrary'], row['author']);
}
function main() {
var sheetId = '1ixlsO8claL7KMouUe8S8GKhn_yZI6yVh-A8jvbzf71A'
var instances = getSpreadsheetData(sheetId);
while (instances.length != 0) {
var curInstanceList = [];
// get head
var curInst = getInstFromRow(instances[0]);
curInstanceList.push(curInst);
var tmpInstances = [];
for (var index = 1; index < instances.length; index++) {
var tmpInst = getInstFromRow(instances[index]);
// if belongs to same author
if (tmpInst.author == curInst.author) {
curInstanceList.push(tmpInst);
} else {
tmpInstances.push(tmpInst);
}
}
instances = tmpInstances
// get all instances with same author
var formName = 'Survey on redundant implementations between Android apps and APIs';
var form = FormApp.create(curInst.author + ' - ' + formName);
form.setTitle(formName);
form.setDescription('We are going to show the customized diff patch here ... FromFoutse(you need to have a section describing your study!) and since you found code snippets from their code you may want to show it to them and formulate specific questions to understand their motivations for refactoring,...etc)');
// sect1
var sect1 = form.addSectionHeaderItem();
sect1.setTitle('Example(s):');
var str = ''
while (curInstanceList.length != 0) {
// get head
var instTmpHead = curInstanceList[0];
str += ('Patch Url : \n' + instTmpHead.url + '\nOld Line Num :\n' + instTmpHead.oldLineNum + '\nNew Line Num :\n' + instTmpHead.newLineNum + '\nImported Library :\n' + instTmpHead.importedLibrary + '\n');
var tmpCurInstanceList = []
for (var i = 1; i < curInstanceList.length; i++) {
var instTmp = curInstanceList[i];
// if belongs to same url
if (instTmpHead.url == instTmp.url) {
str += ('Old Line Num : \n' + instTmp.oldLineNum + '\nNew Line Num :\n' + instTmp.newLineNum + '\nImported Library :\n' + instTmp.importedLibrary + '\n');
} else {
tmpCurInstanceList.push(instTmp);
}
}
curInstanceList = tmpCurInstanceList;
}
//var item11 = form.addTextItem();
//item11.setTitle(str);
sect1.setHelpText(str)
// sect2
form.addPageBreakItem().setTitle('Section 1 of 3');
var sect2 = form.addSectionHeaderItem();
var item21 = form.addMultipleChoiceItem().setTitle('Do you use the API call to refactor your original implementation?')
item21.setChoices([item21.createChoice('Yes'), item21.createChoice('No'), ]).showOtherOption(true);
var item22 = form.addMultipleChoiceItem().setTitle('What is the reason why you did not use the API method in the first place?');
item22.setChoices([item22.createChoice('I did not know about this API method when I was implementing the code.'), item22.createChoice('The required API method had not been introduced at the moment of my implementation.'), ]).showOtherOption(true);
var item23 = form.addMultipleChoiceItem().setTitle('Why did you replace your code with an API call?');
item23.setChoices([item23.createChoice('Because I want to more easily maintain my code.'), item23.createChoice('Because I want to have a higher performance.'), ]).showOtherOption(true);
var item24 = form.addMultipleChoiceItem().setTitle('Do you actively search for API reuse opportunities (i.e., code that can be replaced by API calls)?');
// sect3
var page3 = form.addPageBreakItem().setTitle('Section 2 of 3');
var sect3 = form.addSectionHeaderItem().setTitle('In case you actively search for API reuse opportunities');
var item31 = form.addTextItem();
item31.setTitle('How do you perform such search?');
// sect4
var page4 = form.addPageBreakItem().setTitle('Section 2 of 3');;
var sect4 = form.addSectionHeaderItem().setTitle('In case you do not actively search for API reuse opportunities');
var item41 = form.addTextItem();
item41.setTitle('Why don\'t you search such opportunities?');
var choice1 = item24.createChoice('Yes', page3);
var choice2 = item24.createChoice('No', page4);
item24.setChoices([choice1, choice2]);
// sect5
var page5 = form.addPageBreakItem().setTitle('Section 3 of 3');;
var sect5 = form.addSectionHeaderItem();
sect5.setTitle('How difficult to find an appropriate API to replace my code?')
var item51 = form.addMultipleChoiceItem();
item51.setTitle('Do you find it challenging to find API reuse opportunities?')
.setChoices([item51.createChoice('Yes'), item51.createChoice('No'), ]);
var item52 = form.addTextItem()
item52.setTitle('Which criteria do you consider when replacing a piece of your own code with a corresponding API implementation?')
page4.setGoToPage(page5);
}
}
处理sheet的数据时,里面还有一些自己的逻辑。懒得改了,大家挑自己有用的用吧。
Sheet失效了请联系我。
https://docs.google.com/spreadsheets/d/1ixlsO8claL7KMouUe8S8GKhn_yZI6yVh-A8jvbzf71A/edit#gid=0
其中,1ixlsO8claL7KMouUe8S8GKhn_yZI6yVh-A8jvbzf71A就是sheetId。
My google script which based on Google Sheet and Form的更多相关文章
- An attempt was made to call the method com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder; but it does not exist. Its class, com.google.gson.GsonBuilder, is available from the foll
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/G:/sharp/repo ...
- Google coding Style Guide : Google 编码风格/代码风格 手册/指南
1 1 1 https://github.com/google/styleguide Google 编码风格/代码风格 手册/指南 Style guides for Google-originated ...
- [转]玩转Google开源C++单元测试框架Google Test系列
gtest的官方网站是: http://code.google.com/p/googletest/ 从官方的使用文档里,你几乎可以获得你想要的所有东西 http://code.google.com/p ...
- 转:玩转Google开源C++单元测试框架Google Test系列
转自http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Google ...
- 玩转Google开源C++单元测试框架Google Test系列(转载)
越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...
- 《Google软件测试之道》- Google软件测试介绍
<Google软件测试之道>- Google软件测试介绍 2015-05-21 目录 1 质量与测试 2 角色 3 组织结构 4 爬.走.跑 5 测试类型 相关链接 与Micro ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(转)
转自:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Googl ...
- Google开源C++单元测试框架Google Test
1.玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest 2.玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
原文地址:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Goo ...
随机推荐
- 【分治-前缀积后缀积】JS Window @2018acm徐州邀请赛G
问题 G: JS Window 时间限制: 2 Sec 内存限制: 512 MB 题目描述 JSZKC has an array A of N integers. More over, he has ...
- 【分块】教主的魔法 @洛谷P2801/upcexam3138
时间限制: 1 Sec 内存限制: 128 MB 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列, ...
- poj3253 Fence Repair(贪心+哈夫曼 经典)
https://vjudge.net/problem/POJ-3253 很经典的题,运用哈夫曼思想,想想很有道理!! 具体实现还是有点绕人,最后被long long卡了一下,看数据大小的时候单纯相乘了 ...
- too much recursion(太多递归)Uncaught RangeError: Maximum call stack size exceeded BootstrapValidator报错
在BootstrapValidator中已默认遵守Bootstrap规则,form里的每个输入项目必需包含在类为form-group的标签里,否则BootstrapValidator中定义的field ...
- Spark2.3(四十三):Spark Broadcast总结
为什么要使用广播(broadcast)变量? Spark中因为算子中的真正逻辑是发送到Executor中去运行的,所以当Executor中需要引用外部变量时,需要使用广播变量.进一步解释: 如果exe ...
- maven scope 范围讲解
解决办法: <dependency> <groupId>javax.servlet</groupId> <artifactId>java ...
- 多个组件联合打印输出——PrintableComponentLink
DevExpress强大到难以想象,其很多组件.接口.自定义事件可完成较好的效果,可节省不少事.如下图所示,用的两个ChartControl.一个GridControl制作的平断面示意图,里面涉及不少 ...
- 【Python】 解析Python中的运算符
Python中的运算符相比较于传统的C/C++差别不是很大,主要是一些个别的运算符上的差别.包括:算术.比较.赋值.位.逻辑.成员.身份等.它们的优先级: 符号 说明 ** 指数(最高优先级) ~,+ ...
- 让rpc支持双向通信
rpc采用了C/S模型,不支持双向通信:client只能远程调用server端的RPC接口,但client端则没有RPC供server端调用,这意味着,client端能够主动与server端通信,但s ...
- [转]Redis cluster failover
今天测试了redis cluster failover 功能,在切换过程中很快,但在failover时有force 与takeover 之分 [RHZYTEST_10:REDIS:6237:M ~] ...