【问题标题】:Creating a google form from a google spreadsheet从谷歌电子表格创建谷歌表单
【发布时间】:2017-04-28 01:52:04
【问题描述】:

我创建了一个谷歌电子表格来自动转换成谷歌表单,所以我不必手动将所有问题输入谷歌表单。

我正在编写谷歌应用程序脚本并设法得到所有问题。我试图根据工作表的第一列将表单分成几个部分。因此,如果第一列是“1”,则对应的问题应该在第一部分,如果是“2”,则应该创建另一个部分。依此类推。

我该怎么做?代码是什么?我已将谷歌表附在此处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

【问题讨论】:

  • 我还在“googleSheet”底部附上了我的谷歌电子表格
  • 如果您对代码进行格式化以使其在 StackOverflow 阅读器中更具可读性,将会有所帮助。否则,作为您的第一个问题,这是一个合理的问题!
  • 感谢@NoseKnowsAll!我的代码格式有什么问题吗?我的意思是阅读它?
  • 是的,格式不正确。例如,您的方括号{} 应该全部垂直排列,以便在视觉上很容易分辨出相同代码块中的内容。这也意味着代码块内的所有内容都应该是选项卡(嗯,4 个空格)。这两个修复将使这个问题更具可读性。

标签: google-apps-script google-sheets google-forms


【解决方案1】:

如果您想在下一部分中使用相同的格式,您可以使用一个简单的计数器。我已经编写了一个成功的脚本变体,但这取决于您真正想要什么。

我会做的一些改变

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 节

在这种情况下,您应该利用您的dataquestionType,在循环之前的某处添加一个计数器var sectionCount = 0。然后在你的 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 != ''
}

【讨论】:

  • 有什么方法可以让我在第一行有我的问题并且答案可以自动转换为数字。因为表格中的每个选择值基本上都是 1-5?
  • 如果您希望问题具有原样的选项,您还可以将相对列索引存储在脚本属性中。因此,由于我们有一系列选择,我们将执行for 循环,在其中我们将执行PropertiesService.getScriptProperties().setProperty(items[i], i + 1)。然后你会有一个单独的函数,它可以与响应电子表格一起使用并简单地获取响应,并使用 PropertiesService.getScriptProperties().getProperty(answerString) 并将答案设置为你给它的任何数字
  • 我在下面发布了我的更新解决方案,并在 for 循环 for (var i = 0; i &lt; items.length; ++i) { var answerstring = 0; PropertiesService.getScriptProperties().setProperty(items[i]‌, i + 1) } 的下方创建了一个 for 循环。我的回复表是一个不同的项目文件。我如何编写一个函数来访问来自不同项目的不同工作表?
【解决方案2】:
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);

}

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多