首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Google中获取数据并在Google上显示?

如何从Google中获取数据并在Google上显示?
EN

Stack Overflow用户
提问于 2020-12-01 15:41:11
回答 2查看 448关注 0票数 0

我正在制作一个Google表单,我想给它添加一些问题,但是这些问题应该是从随机抽取的,这些问题将出现在Google 中。为此需要做些什么?例如:我想从Google工作表中显示出20个问题库中的5个随机问题

P.s :我确实尝试过关于Stackoverflow的解决方案,但对我的目的并没有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-01 20:07:50

为了创建一个解决问题的脚本,我创建了一个示例表,如下所示:

其中A是问题,后面的列是选项。注意:如果您只需要生成没有任何选项的问题,您可以选择将其从工作表中删除。我包括了选项,因为这将是最坏的情况在你的问题。

因此,首先,我们需要有表单和电子表格的ID:

代码语言:javascript
运行
复制
var formID = <FORM_ID>;
var ssID = <SPREADSHEET_ID>;
var fData = FormApp.openById(formID);
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Sheet1");

下一步是尝试从电子表格中生成问题:

代码语言:javascript
运行
复制
function populateForm() {
  // get all values from spreadsheet
  var ssValues = wsData.getDataRange().getValues();

  // traverse all values
  for(var row = 0; row < ssValues.length; row++){
    var newItem;
    var options = [];
    for(var col = 0; col < ssValues[row].length; col++){
      var cellValue = ssValues[row][col];
      switch(col) {
        case 0:
          // if question, add as item
          newItem = fData.addListItem().setTitle(cellValue).getId(); 
          break;
        default:
          // if not question, add as choice
          options.push(cellValue);
      }
    }
    // add accumulated options as choices for the recently added item
    fData.getItemById(newItem).asListItem().setChoiceValues(options);
  }
}

在这个步骤之后,您应该能够将所有的问题添加到表单中。现在,由于我们只需要生成5个随机问题,所以我添加了下面的函数供我们使用。

代码语言:javascript
运行
复制
function getFiveRandomQuestions(array){
  // randomly remove questions until 5 remains
  for(var i = array.length - 1; i >= 5; i--){
    array.splice(Math.floor(Math.random() * array.length), 1);
  }
  return array;
}

上面的函数接受一个数组(getValues()的结果),然后随机地从它中删除项,直到只剩下5个条目。

下面是集成上述所有功能后的代码。注意:我添加了clearForm()以删除现有项,所以每当我运行populateForm()时表单就会重置。这是为了测试,以防你需要它。尽可能多地修改代码。

代码语言:javascript
运行
复制
// Randomize Form from Sheets
var formID = <FORM_ID>;
var ssID = <SPREADSHEET_ID>;
var fData = FormApp.openById(formID);
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Sheet1");

function clearForm(){
  // clears all items
  var items = fData.getItems();
  while(items.length > 0){
    fData.deleteItem(items.pop());
  }
}

function getFiveRandomQuestions(array){
  // randomly remove questions until 5 remains
  for(var i = array.length - 1; i >= 5; i--){
    array.splice(Math.floor(Math.random() * array.length), 1);
  }
  return array;
}

function populateForm() {
  // call clearForm to prevent appending newly randomized questions
  clearForm();

  var ssValues = wsData.getDataRange().getValues();

  // remove random questions until 5 are remaining
  var formItems = getFiveRandomQuestions(ssValues);

  for(var row = 0; row < formItems.length; row++){
    var newItem;
    var options = [];
    for(var col = 0; col < formItems[row].length; col++){
      var cellValue = formItems[row][col];
      switch(col) {
        case 0:
          // if question, add as item
          newItem = fData.addListItem().setTitle(cellValue).getId(); 
          break;
        default:
          // if not question, add as choice
          options.push(cellValue);
      }
    }
    // add accumulated options as choices for the recently added item
    fData.getItemById(newItem).asListItem().setChoiceValues(options);
  }
}

下面是示例输出:

请注意,这个答案很简单,仍然可以根据您的测试用例进行优化。如果有什么不清楚的地方,可以随意提问。

编辑:

如果您想添加硬编码的问题,您需要在循环之前添加它。

代码语言:javascript
运行
复制
// remove random questions until 5 are remaining
var formItems = getFiveRandomQuestions(ssValues);
    
// start of hardcoded questions
fData.addListItem().setTitle('Name').getId(); 
fData.addListItem().setTitle('Email').getId(); 
// end of hardcoded questions    

for(var row = 0; row < formItems.length; row++){

另外,如果您希望只有五个问题,并且已经通过硬代码获得了2个问题,那么我们需要将随机化函数减少到3而不是5。

代码语言:javascript
运行
复制
// note that I renamed the function to getRandomQuestions so bear in mind to update the function call too
function getRandomQuestions(array){
  for(var i = array.length - 1; i >= 3; i--){
    array.splice(Math.floor(Math.random() * array.length), 1);
  }
  return array;
}

样本输出:

票数 5
EN

Stack Overflow用户

发布于 2020-12-07 08:39:33

对于有多个部分,您也可以使用分页。在你的情况下

代码语言:javascript
运行
复制
fData.addPageBreakItem();

这将在表单的新页上形成一个部分。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65093674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档