【问题标题】:Can I update Google Form questions with a spreadsheet?我可以使用电子表格更新 Google 表单问题吗?
【发布时间】:2020-12-28 17:58:49
【问题描述】:

我有大量用于一个项目的 Google 表单,每个表单都有相同的部分和问题,只是选择不同。每次我想更新一个问题时,我都必须单独更改每个表格,这需要很长时间。我想知道是否有办法将表单链接到工作表,这样我就可以更改电子表格中的问题,并且它会在每个连接的表单中更新。

【问题讨论】:

    标签: google-sheets google-forms


    【解决方案1】:

    我可以建议的一个选项是在您的 Google 表格中创建一个 container-bound script,以使用 Apps 脚本更新多个 Google 表单的问题。


    示例表:

    我们有一个 Google 表格,其中有 2 个表格,分别名为“问题”和“表格”。

    Sheet:Questions 包含您的 Google 表单中可用的问题列表。 To Update 列可用作标志,以确定您要在 Google 表单中更新哪些问题。

    Sheet:Forms 包含您希望在其中更新问题的 Google 表单 ID 列表。


    示例应用脚本代码:

    function updateFormsQuestions() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var formsSheet = ss.getSheetByName("Forms");
      var questionsSheet = ss.getSheetByName("Questions");
      
      //Get the list of forms to update
      var formsList = formsSheet.getRange(2,1,formsSheet.getLastRow()-1).getValues();
      Logger.log(formsList);
      
      //Get the list of questions to update
      var questionIndex = [];
      var qCheckbox = questionsSheet.getRange(2,2,questionsSheet.getLastRow()-1,1).getValues();
      Logger.log(qCheckbox);
      
      qCheckbox.forEach(function(currentValue, index){ 
                        if(currentValue[0] == true)questionIndex.push(index);
      });
      Logger.log(questionIndex);
    
      //Open Form and get all items
      for( var i = 0; i < formsList.length; i++){
       
        var forms = FormApp.openById(formsList[i][0]);
        var items = forms.getItems();
    
        //Update question
        questionIndex.forEach(function(index){
                              Logger.log(index);
                              Logger.log(questionsSheet.getRange(index + 2, 1).getValue());
                              items[index].setTitle(questionsSheet.getRange(index + 2, 1).getValue());
        });
        
      }
    }
    

    它有什么作用?

    1. 获取Sheet:Forms 下的 Google 表单 ID 列表
    2. Cell B2开始获取Sheet:Questions下的所有复选框值。
    3. 如果设置为 true,请检查每个复选框的值,然后将当前索引推送到 questionIndex 数组。 (请注意,在 javascript 数组中,索引从零开始)。
    4. 使用FormApp.openById() 使用for 循环逐一打开步骤1 中列出的每个表单。然后使用.getItems() 获取当前表单的所有项目。它会为您提供表单中可用的一系列项目(这可能代表您在表单中提出的问题)。

    表单项可以作为数组访问。因此它应该从零开始。 (问题 1 = 索引 0,问题 2 = 索引 1 ……以此类推)

    1. 使用.setTitle() 更新当前项目中的问题。新标题将基于 Sheet:Questions 列 A 下的单元格值。假设您已经使用 .getRange() 选择了正确的单元格范围,您可以使用 .getValue() 获取单元格的值。

    请注意,当获取单元格值questionsSheet.getRange(index + 2, 1).getValue() 时,我们将行索引增加 2。如果我们想访问Cell A3, row = 3; col = 1,单元格行和列从表格中的 1 开始。我们之前在第 3 步中保存的索引从零开始(因为我们使用了数组)。如果你好奇为什么我们增加 2 而不是 1。原因是因为我们在第 2 步中开始从第 2 行而不是第 1 行获取复选框值时也调整了索引。

    Sheet:Questions C 列将显示qCheckbox array 的索引,而 D 列将显示访问行时工作表的索引。


    输出:

    之前:

    之后:


    其他参考:

    Forms Service - allows scripts to create, access and modify Google Forms

    Spreadsheet Service - allows scripts to create, access, modify Google Sheets

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多