从 google 电子表格创建 google 表单
Creating a google form from a google spreadsheet
我创建了一个 google spreadsheet 来自动转换成 google 形式,所以我不必手动将所有问题输入到 google表格。
我正在编写 google 应用程序脚本并设法获得所有 questions.I 我正在尝试根据 sheet 的第一列将表单分成多个部分。因此,如果第一列是“1”,则对应的问题应位于第一部分,如果是“2”,则应创建另一个 section.And,依此类推。
我该怎么做?密码是什么?我已经附上 google sheet 在这里 Google spreadsheet
function myFunction()
{
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var range = ss.getDataRange();
var data = range.getValues();
var numberRows = range.getNumRows();
var numberColumns = range.getNumColumns();
var firstRow = 1;
var form = FormApp.openById('1hIQCLT_JGLcvjz44vXTvP5ziia6NnwCqWBxYT4h2uCk');
var items = form.getItems();
var ilength = items.length;
for (var i=0; i<items.length; i++)
{
form.deleteItem(0);
}
for(var i=0;i<numberRows;i++)
{
Logger.log(data);
var questionType = data[i][0];
if (questionType=='')
{
continue;
}
//choose the type of question from the first column of the spreadsheet
else if(questionType=='1')
{
var rowLength = data[i].length;
var currentRow = firstRow+i;
var currentRangeValues = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange(currentRow,1,1,rowLength).getValues();
var getSheetRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getDataRange();
var numberOfColumnsSheet = getSheetRange.getNumColumns();
var numberOfOptionsInCurrentRow = numberOfColumnsSheet;
var lastColumnInRange = String.fromCharCode(64 + (numberOfOptionsInCurrentRow));
var range_string = 'C' + currentRow + ":" + lastColumnInRange + currentRow;
var optionsArray = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange(range_string).getValues();
var choicesForQuestion =[];
for (var j=0;j<optionsArray[0].length;j++)
{
choicesForQuestion.push(optionsArray[0][j]);
}
form.addMultipleChoiceItem().setTitle(data[i][1]).setHelpText("").setChoiceValues(choicesForQuestion).setRequired(true);
}
else
{
continue;
}
}
form.addParagraphTextItem()
.setTitle('Please specify and attach relevant documents'); // add the text question at the last
form.addPageBreakItem().setTitle('Identity - Asset Management').setHelpText("")();
}
googleSheet
如果您想在下一节中使用完全相同的格式,您可以使用一个简单的计数器。我已经写了一个成功的脚本变体,但这取决于你真正想要什么。
我会做的一些改变
for (i = 0; i < items.length; i++) {
form.deleteItem(items[i])
}
而不是当前的 form.deleteItem(0);
。否则我看到您获取了所有数据,但是您不使用它。每次需要选项时调用电子表格应用程序会导致它 运行 慢很多。关于 for
循环的更多信息:将 Logger.log(data);
移出循环。每次转到下一行数据时,您没有理由继续记录完整的数据范围。或者将其更改为 Logger.log(data[i]);
这样更有意义。
你已经做了一个
if (questionType=='') {
continue;
}
跳过空行,所以不太确定最后的 else
是什么意思。无论如何,循环都会自行进入下一个选项。
现在您的设置方式是您在电子表格中的问题必须井井有条。那就是你不能有
- 第 1 部分
- 第 2 部分
- 第 1 部分
因为这将创建 3 个部分而不是 2 个部分。但是,让我们继续假设电子表格只会以您只有
这样的序列的方式设置
- 第 1 部分
- 第 1 部分
- 第 2 部分
在这种情况下,您应该通过在循环之前的某处添加一个计数器 var sectionCount = 0
来利用您的 data
和 questionType
。然后在你的 for
循环中你做一个简单的
else if (questionType != sectionCount) {
form.addSectionHeaderItem().setTitle('Section ' + questionType)
sectionCount++
}
这将创建该部分(前提是 A 列中的数字始终递增 1)。然后在同一个 for
循环中,您不再需要 if
语句,只需使用
items = data[i].slice(2, data[i].length + 1)
items = items.filter(chkEmpty)
form.addMultipleChoiceItem().setTitle(data[i][1]).setChoiceValues(items)
哪里
function chkEmpty(val){
return val != ''
}
function myFunction()
{
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var ss2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2');
var range = ss.getDataRange();
var data = range.getValues();
var numberRows = range.getNumRows();
var numberColumns = range.getNumColumns();
var firstRow = 1;
var form = FormApp.openById('1xlXDZB5jhbUWpWHxxJwY-ut5oYkh4OfIQSTGsnwGTW4');
var sectionCount = 0
// deletes the previous changes
var items = form.getItems();
var ilength = items.length;
for (i = 0; i < items.length; i++)
{
form.deleteItem(items[i])
}
for(var i=0;i<numberRows;i++)
{
var questionType = data[i][0];
if (questionType=='')
{
continue;
}
else if (questionType != sectionCount )
{
if (sectionCount != 0 )
{
// form.addParagraphTextItem()
// .setTitle('Please specify and attach relevant documents'); // add the text question at the last
// write the description here using SectionCount
}
sectionCount++ // add new section to the form
form.addSectionHeaderItem().setTitle('Section ' + questionType).setHelpText(""); // add section header and title
}
items = data[i].slice(2, data[i].length + 1)
items = items.filter(chkEmpty)
form.addMultipleChoiceItem().setTitle(data[i]
[1]).setChoiceValues(items).setRequired(true);
if ( i == (numberRows-1)){
// form.addParagraphTextItem()
// .setTitle('Please specify and attach relevant documents');
}
}
function chkEmpty(val)
{
return val != ''
}
Logger.log(data);
}
我创建了一个 google spreadsheet 来自动转换成 google 形式,所以我不必手动将所有问题输入到 google表格。
我正在编写 google 应用程序脚本并设法获得所有 questions.I 我正在尝试根据 sheet 的第一列将表单分成多个部分。因此,如果第一列是“1”,则对应的问题应位于第一部分,如果是“2”,则应创建另一个 section.And,依此类推。
我该怎么做?密码是什么?我已经附上 google sheet 在这里 Google spreadsheet
function myFunction()
{
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var range = ss.getDataRange();
var data = range.getValues();
var numberRows = range.getNumRows();
var numberColumns = range.getNumColumns();
var firstRow = 1;
var form = FormApp.openById('1hIQCLT_JGLcvjz44vXTvP5ziia6NnwCqWBxYT4h2uCk');
var items = form.getItems();
var ilength = items.length;
for (var i=0; i<items.length; i++)
{
form.deleteItem(0);
}
for(var i=0;i<numberRows;i++)
{
Logger.log(data);
var questionType = data[i][0];
if (questionType=='')
{
continue;
}
//choose the type of question from the first column of the spreadsheet
else if(questionType=='1')
{
var rowLength = data[i].length;
var currentRow = firstRow+i;
var currentRangeValues = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange(currentRow,1,1,rowLength).getValues();
var getSheetRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getDataRange();
var numberOfColumnsSheet = getSheetRange.getNumColumns();
var numberOfOptionsInCurrentRow = numberOfColumnsSheet;
var lastColumnInRange = String.fromCharCode(64 + (numberOfOptionsInCurrentRow));
var range_string = 'C' + currentRow + ":" + lastColumnInRange + currentRow;
var optionsArray = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange(range_string).getValues();
var choicesForQuestion =[];
for (var j=0;j<optionsArray[0].length;j++)
{
choicesForQuestion.push(optionsArray[0][j]);
}
form.addMultipleChoiceItem().setTitle(data[i][1]).setHelpText("").setChoiceValues(choicesForQuestion).setRequired(true);
}
else
{
continue;
}
}
form.addParagraphTextItem()
.setTitle('Please specify and attach relevant documents'); // add the text question at the last
form.addPageBreakItem().setTitle('Identity - Asset Management').setHelpText("")();
}
googleSheet
如果您想在下一节中使用完全相同的格式,您可以使用一个简单的计数器。我已经写了一个成功的脚本变体,但这取决于你真正想要什么。
我会做的一些改变
for (i = 0; i < items.length; i++) {
form.deleteItem(items[i])
}
而不是当前的 form.deleteItem(0);
。否则我看到您获取了所有数据,但是您不使用它。每次需要选项时调用电子表格应用程序会导致它 运行 慢很多。关于 for
循环的更多信息:将 Logger.log(data);
移出循环。每次转到下一行数据时,您没有理由继续记录完整的数据范围。或者将其更改为 Logger.log(data[i]);
这样更有意义。
你已经做了一个
if (questionType=='') {
continue;
}
跳过空行,所以不太确定最后的 else
是什么意思。无论如何,循环都会自行进入下一个选项。
现在您的设置方式是您在电子表格中的问题必须井井有条。那就是你不能有
- 第 1 部分
- 第 2 部分
- 第 1 部分
因为这将创建 3 个部分而不是 2 个部分。但是,让我们继续假设电子表格只会以您只有
这样的序列的方式设置- 第 1 部分
- 第 1 部分
- 第 2 部分
在这种情况下,您应该通过在循环之前的某处添加一个计数器 var sectionCount = 0
来利用您的 data
和 questionType
。然后在你的 for
循环中你做一个简单的
else if (questionType != sectionCount) {
form.addSectionHeaderItem().setTitle('Section ' + questionType)
sectionCount++
}
这将创建该部分(前提是 A 列中的数字始终递增 1)。然后在同一个 for
循环中,您不再需要 if
语句,只需使用
items = data[i].slice(2, data[i].length + 1)
items = items.filter(chkEmpty)
form.addMultipleChoiceItem().setTitle(data[i][1]).setChoiceValues(items)
哪里
function chkEmpty(val){
return val != ''
}
function myFunction()
{
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var ss2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2');
var range = ss.getDataRange();
var data = range.getValues();
var numberRows = range.getNumRows();
var numberColumns = range.getNumColumns();
var firstRow = 1;
var form = FormApp.openById('1xlXDZB5jhbUWpWHxxJwY-ut5oYkh4OfIQSTGsnwGTW4');
var sectionCount = 0
// deletes the previous changes
var items = form.getItems();
var ilength = items.length;
for (i = 0; i < items.length; i++)
{
form.deleteItem(items[i])
}
for(var i=0;i<numberRows;i++)
{
var questionType = data[i][0];
if (questionType=='')
{
continue;
}
else if (questionType != sectionCount )
{
if (sectionCount != 0 )
{
// form.addParagraphTextItem()
// .setTitle('Please specify and attach relevant documents'); // add the text question at the last
// write the description here using SectionCount
}
sectionCount++ // add new section to the form
form.addSectionHeaderItem().setTitle('Section ' + questionType).setHelpText(""); // add section header and title
}
items = data[i].slice(2, data[i].length + 1)
items = items.filter(chkEmpty)
form.addMultipleChoiceItem().setTitle(data[i]
[1]).setChoiceValues(items).setRequired(true);
if ( i == (numberRows-1)){
// form.addParagraphTextItem()
// .setTitle('Please specify and attach relevant documents');
}
}
function chkEmpty(val)
{
return val != ''
}
Logger.log(data);
}