(Google Script)需要帮助找出如何在创建Google表单时减少对Google脚本服务的调用

时间:2017-09-12 21:55:01

标签: javascript google-apps-script google-form google-sheets-api

我是新来的,如果我的格式/方法需要一些工作,请道歉。

我目前正在编写一个谷歌脚本,该脚本可以生成个性化调查(谷歌表格),这些调查将与一年前回答非常类似调查的人分享。

我有一个谷歌电子表格,其中包含调查的所有问题,以及个人以前的回复。

该脚本似乎正在运行(使用电子表格数据生成个性化表单);但是,我遇到的问题是脚本运行时间太长而且我没时间了。它可以在超时之前的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);     
            }
        }
    }
}

2 个答案:

答案 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理论,计算理论等等。

这里有一些我推荐给你的书,大多数都很短并且很有启发性:

  • c编程语言
  • 编程实践
  • CLRS算法
  • 设计模式(四人一组)
  • 计算理论 - sipser
  • 一些OS理论书
  • 风格元素(strunk)

信不信由你,你只能阅读上面的清单,并在现场(有或没有学位)走得很远,祝你好运。