我是新来的,如果我的格式/方法需要一些工作,请道歉。
我目前正在编写一个谷歌脚本,该脚本可以生成个性化调查(谷歌表格),这些调查将与一年前回答非常类似调查的人分享。
我有一个谷歌电子表格,其中包含调查的所有问题,以及个人以前的回复。
该脚本似乎正在运行(使用电子表格数据生成个性化表单);但是,我遇到的问题是脚本运行时间太长而且我没时间了。它可以在超时之前的6分钟内产生大约10个调查,所以我一直在制作它们,但我刚刚用完谷歌脚本调用的每日时间限制。
是否有人就如何更有效地制作此代码提出任何建议制作个性化调查?
作为代码现在如何工作的指南(我认为),它在前几行中提取电子表格数据,然后为每个学校运行for循环,然后在for循环内运行另一个for循环填充表格中的每个问题。
我可以提供必要时生成的电子表格和示例表单。
感谢您的任何建议。
-Nick
function pullDataMakeForm() {
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange("Sheet1!A1:CL70")
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var tempr = i+7;
var schoolName = data[1][tempr];
var form1 = FormApp.create("Profile Survey - " + schoolName).setAllowResponseEdits(true)
.setConfirmationMessage('Thanks for responding!')
.setDescription("This is the profile survey. Your answers from last year have been provided below each question."); //makes form
form1.setDestination(FormApp.DestinationType.SPREADSHEET, 'spreadsheetID');
for (var j = 0; j < data.length; ++j) {
var row = data[j];
var questionText = row[2];
var questionType = row[4];
var questionDescription = row[i+7];
var newSection = row[6];
var sectionTitle = row[1];
if (newSection == "Y") {
var item0 = form1.addSectionHeaderItem();
item0.setTitle(sectionTitle);
}
if (questionType == "Short Answer") {
var item1 = form1.addTextItem()
item1.setTitle(questionText).setHelpText(questionDescription) /*addItem1*/
} else if (questionType == "Paragraph") {
var item2 =form1.addParagraphTextItem()
item2.setTitle(questionText).setRequired(false).setHelpText(questionDescription)
} else if (questionType == "Date") {
var item4 = form1.addDateItem()
item4.setTitle(questionText).setRequired(false).setHelpText(questionDescription)
} else if (questionType == "Multiple Choice"){
var item3 = form1.addMultipleChoiceItem()
item3.setTitle(questionText)
.setRequired(false).setHelpText(questionDescription).setChoices([
item3.createChoice('Yes'),
item3.createChoice('No')
])
.showOtherOption(false);
}
}
}
}
答案 0 :(得分:0)
我认为你所拥有的循环理念是明智的。我不知道的是,每个表单的数据来自存储在连续列中的数据,因此第一个循环现在循环遍历列,第二个循环循环遍历行。
它以前工作,因为它每次只需要增加1来到下一列。但是,即使在用完列之后你也可能继续循环,因为你是循环行而不是列。
function pullDataMakeForm()
{
var sheet = SpreadsheetApp.getActiveSheet();
var nameRange=sheet.getRange("H3:CL3");//The range of all school names
var name=nameRange.getValues();
var dataRange = sheet.getRange("A2:CL70");//The range of all question data with data for each school in consecutive columns
var data=dataRange.getValues();
for (var i = 0; i < name[0].length; ++i)//loops over columns
{
var schoolName = name[0][i];
var form1 = FormApp.create("Profile Survey - " + schoolName).setAllowResponseEdits(true)
.setConfirmationMessage('Thanks for responding!')
.setDescription("This is the profile survey. Your answers from last year have been provided below each question.");
form1.setDestination(FormApp.DestinationType.SPREADSHEET, 'spreadsheetID');
for (var j = 0; j < data.length; ++j)//loops over rows
{
var row = data[j];
var questionText = row[2];
var questionType = row[4];
var questionDescription = row[i+7];//move one column to the right with each new school
var newSection = row[6];
var sectionTitle = row[1];
if (newSection == "Y")
{
var item0 = form1.addSectionHeaderItem();
item0.setTitle(sectionTitle);
}
if (questionType == "Short Answer")
{
var item1 = form1.addTextItem()
item1.setTitle(questionText).setHelpText(questionDescription) /*addItem1*/
} else if (questionType == "Paragraph")
{
var item2 =form1.addParagraphTextItem()
item2.setTitle(questionText).setRequired(false).setHelpText(questionDescription)
} else if (questionType == "Date") {
var item4 = form1.addDateItem()
item4.setTitle(questionText).setRequired(false).setHelpText(questionDescription)
} else if (questionType == "Multiple Choice")
{
var item3 = form1.addMultipleChoiceItem()
item3.setTitle(questionText)
.setRequired(false).setHelpText(questionDescription).setChoices([
item3.createChoice('Yes'),
item3.createChoice('No')
])
.showOtherOption(false);
}
}
}
}
我没有深入研究这些问题的逻辑,因为我最近只制作了几个表格,所以我对它的了解并不多。
答案 1 :(得分:-1)
这个问题目前在你头上,但我会给你一个提升:
使用Google工作表来存储数据,并根据需要将其缓存在您的服务器上。由于请求有限,您可能希望创建一个按设定的计划运行的程序来更新缓存。这将允许您在缓存中查找 first 中的数据,并根据需要发出服务请求,或者可以将其添加(稍后由所述预定程序运行)。
看起来你正在尝试迭代表行*列,但这里不需要双循环,众所周知的是二次循环 在算法复杂性方面。
阅读有关编程,算法和数据结构,os理论,计算理论等等。
这里有一些我推荐给你的书,大多数都很短并且很有启发性:
信不信由你,你只能阅读上面的清单,并在现场(有或没有学位)走得很远,祝你好运。