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 ...
随机推荐
- db2 reorg详解
reorgchk,检查table index 是否需要重组.reorg 重组,重新放置数据位置.runstats 统计信息,可以优化查询器 一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作, ...
- 记一次linux服务部署
虽然很简单,但是还是想记录一下: 准备一台云主机并连接到云主机上 因为是 springboot 项目,采用了前后端分离部署.所以就没有使用 Tomcat.为应用程序创建文件夹. 添加启动脚本 star ...
- Codeforces899D Shovel Sale(思路)
http://codeforces.com/problemset/problem/899/D 还是得tag一下,以下代码只有G++ 14 6.4.0能过,其他都过不了不知为什么? 思路:先求出最多的9 ...
- Linux Performance Profiling & Visualization
https://github.com/figozhang/CLK/tree/master/CLK2016 http://www.linuxep.com/
- Eclipse/myEclipse 代码提示/自动提示/自动完成设置
设置eclipse/myEclipse代码提示可以方便开发者,不用在记住拉杂的单词,只用打出首字母,就会出现提示菜单.如同dreamweaver一样方便. 1.菜单window->Prefere ...
- EasyMock 简单使用
参考案例:(本位使用markdown编写)https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/https://www.yii ...
- linux平台下Tomcat的安装与优化
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...
- SpringBoot2.0+Shiro+JWT 整合
SpringBoot2.0+Shiro+JWT 整合 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息. 我们利用一定的编 ...
- java 根据系统日期获取前一天、后一天时间(根据初始日期推算出期望(向前/向后)日期)
1.情景展示 java 根据系统当前日期获取前一天日期.后一天日期,或者根据初始日期推算出期望(向前/向后)日期. 2.解决方案 导包 import java.text.ParseExcepti ...
- Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -
mysql -A不预读数据库信息(use dbname 更快)—Reading table information for completion of table and column names Y ...