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的更多相关文章

  1. 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 ...

  2. Google coding Style Guide : Google 编码风格/代码风格 手册/指南

    1 1 1 https://github.com/google/styleguide Google 编码风格/代码风格 手册/指南 Style guides for Google-originated ...

  3. [转]玩转Google开源C++单元测试框架Google Test系列

    gtest的官方网站是: http://code.google.com/p/googletest/ 从官方的使用文档里,你几乎可以获得你想要的所有东西 http://code.google.com/p ...

  4. 转:玩转Google开源C++单元测试框架Google Test系列

    转自http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Google ...

  5. 玩转Google开源C++单元测试框架Google Test系列(转载)

    越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...

  6. 《Google软件测试之道》- Google软件测试介绍

    <Google软件测试之道>- Google软件测试介绍 2015-05-21 目录 1 质量与测试  2 角色  3 组织结构  4 爬.走.跑  5 测试类型  相关链接 与Micro ...

  7. 玩转Google开源C++单元测试框架Google Test系列(gtest)(转)

    转自:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Googl ...

  8. Google开源C++单元测试框架Google Test

    1.玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest 2.玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - ...

  9. 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)

    原文地址:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Goo ...

随机推荐

  1. mysql [索引优化] -- in or替换为union all

    一个文章库,里面有两个表:category和article.category里面有10条分类数据.article里面有 20万条.article里面有一个"article_category& ...

  2. Python - 列联表的独立性检验(卡方检验)

    Python - 列联表的独立性检验(卡方检验) 想对两个或两个以上因子彼此之间是否相互独立做检验时,就要用到卡方检验,原以为在Python中实现会像R的chisq.test一样简便,但scipy的s ...

  3. ABAP WB01 BDC ”No batch input data for screen & &“ ”没有屏幕 & & 的批输入数据“

    公司今年计划大批扩建门店,需要自动化维护相关主数据,其中就有一步通过调用 WB01的BDC录屏来自动创建地点,前台跑没有问题,但后台JOB死活不行,屏幕是以前同事录好的,只能硬着头皮修改. 后台任务日 ...

  4. AxWindowsMediaPlayer控件的使用

    首先要知道如何将控件添加到工具箱中,步骤如下: “工具箱”中单击右键,选择“选择项”菜单,打开“选择工具箱项”窗口,选择“COM组件”标签,在列表中找到并勾选“Windows Media Player ...

  5. adminlte.js-页面模版

    html页面 使用cdn加速. <!DOCTYPE html> <html lang="en"> <head> <title>Tes ...

  6. CDH下集成spark2.2.0与kafka(四十一):在spark+kafka流处理程序中抛出错误java.lang.NoSuchMethodError: org.apache.kafka.clients.consumer.KafkaConsumer.subscribe(Ljava/util/Collection;)V

    错误信息 19/01/15 19:36:40 WARN consumer.ConsumerConfig: The configuration max.poll.records = 1 was supp ...

  7. Javascript 生成随机数

    Math.random().toString(16).substring(2) // 固定13位 Math.random().toString(36).substring(2)//倍数不固定 22-2 ...

  8. dotnet ef

    dotnet ef migrations add <Name-of-Migration> dotnet ef database update

  9. react diff 原理

    (1) 把树形结构按照层级分解,只比较同级元素.(2) 列表结构的每个单元添加唯一的 key 属性,方便比较.(3) React 只会匹配相同 class 的 component(这里面的 class ...

  10. 【Linux】关于ffmpeg的一些常见用法

    一.FFmpeg简介 FFmpeg是一款非常快速的视频和音频转换器, 是开源项目 FFmpeg (Fast Forward moving pictures expert group) 的命令行程序. ...