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. ionic2引入cordova插件时提示 no provider for * 错误

    直接上答案,如果出现这个错误,直接在component里添加一行代码: import { FileOpener } from '@ionic-native/file-opener'; @Compone ...

  2. 法嵌入互操作类型“SHDocVw.ShellWindowsClass”请改用适用的接口-解决方法

    点DLL名字,---属性----------嵌入互操作类型(设置为false)

  3. sshd服务

    SSHD服务 介绍:SSH 协议:安全外壳协议.为 Secure Shell 的缩写.SSH 为建立在应用层和传输层基础上的安全协议. 作用 sshd服务使用SSH协议可以用来进行远程控制, 或在计算 ...

  4. Android的Databinding-需要使用控件id,listener以及布局有include的场景

    主的布局xml文件: <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bin ...

  5. 毕业论文Word格式技巧

    word利用多级列表功能实现章节标题自动编号 坑:在选择级别1后,直接在当前对话框直接继续设置级别2:然后选中级别2,设置相应的格式,主要在将级别链接到样式处选择为标题2,然后要在库中显示的级别选择级 ...

  6. iframe中video没有全屏按钮

    HTML内联框架元素 <iframe> iframe默认不允许全屏, 如果内嵌了video那么控制条上将不显示全屏按钮, 通过添加allowfullscreen属性可以开启全屏功能. mo ...

  7. settings设置中文admin

    所以更改setttings.py 下 LANGUAGE_CODE = 'zh-Hans'即可

  8. Jenkins安装卸载

    下载安装去Jenkins官网下载Jenkins,Centos的话会下载到.rpm安装文件 安装.rpm文件使用命令rpm -ivh **.rpm 安装完成之后使用命令rpm -qc jenkins查看 ...

  9. np.memmap读取大文件

    Numpy中的ndarray是一种新形式的Python内建类型.因此,它可以在需要时被继承.ndarray形成了许多有用类的基础. np.memmap就是其中一种,它是内存映射文件.本质上就是使用C语 ...

  10. Linux(CentOS)安装Node.JS和npm的两种方式(yum安装和源码安装)

    yum安装 yum安装是将yum源中的rpm包下载到本地,安装这个rpm包.这个rpm包是别人编译安装好的二进制包.这种方式方便快捷,特别是不用考虑包依赖. 0.了解linux版本 通过 uname ...