You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Forms测验提取插件Manifest文件编写及报错解决方案

Google Forms测验提取工具插件部署问题

问题说明

已编写脚本可正常提取Google Forms中创建的测验题目与答案,单独运行功能无异常。部署为插件更新manifest文件时收到报错:"appsscript.json" 存在错误:无效的manifest:未知字段:[form]。

现有功能代码

function myFunction() {
  // TODO: try to get another form by ID
  //var form1 = FormApp.getActiveForm();
  var form1 = FormApp.openById('1OLu1xIL6qThi44Y9NJddE-TdBxIA4_Txj7M9z_oxKlU');
  //var form1 = FormApp.openByUrl('https://docs.google.com/forms/d/e/1OLu1xIL6qThi44Y9NJddE-TdBxIA4_Txj7M9z_oxKlU');
  var items = form1.getItems();
  console.log("total questions: " + items.length);
  for (var i = 0; i < items.length; i++) {
    var item = items[i];
    //console.log(item.getType() === FormApp.ItemType.MULTIPLE_CHOICE);
    //console.log(item.getType());
    var x = 0;
    console.log('***** New Question *****');
    switch(item.getType()) {
      case FormApp.ItemType.MULTIPLE_CHOICE:
        this.extractMultipleChoice(item);
        break;
      case FormApp.ItemType.CHECKBOX:
        this.extractCheckbox(item);
        break;
      case FormApp.ItemType.PARAGRAPH_TEXT:
        this.extractParagraphText(item);
        break;
      case FormApp.ItemType.TEXT:
        this.extractText(item);
        break;
    }
  }
}
function extractMultipleChoice(item) {
  var question = item.asMultipleChoiceItem();
  console.log("Question: " + question.getTitle());
  console.log("Number of answers: " + question.getChoices().length);
  var answers = question.getChoices();
  for (var j = 0; j < answers.length; j++) {
    var answer = answers[j];
    console.log(answer.getValue());
    console.log("Is correct answer? " + answer.isCorrectAnswer());
  }
}
function extractCheckbox(item) {
  var question = item.asCheckboxItem();
  console.log("Question: " + question.getTitle());
  console.log("Number of answers: " + question.getChoices().length);
  var answers = question.getChoices();
  for (var k = 0; k < answers.length; k++) {
    var answer = answers[k];
    console.log(answer.getValue());
    console.log("Is correct answer? " + answer.isCorrectAnswer());
  }
}
function extractParagraphText(item) {
  var question = item.asParagraphTextItem();
  console.log("Question: " + question.getTitle());
}
function extractText(item) {
  var question = item.asTextItem();
  console.log("Question: " + question.getTitle());
}

报错的manifest文件内容

{
  "timeZone": "America/Los_Angeles",
  "dependencies": {
    "enabledAdvancedServices": [
      {
        "userSymbol": "AdSense",
        "version": "v2",
        "serviceId": "adsense"
      }
    ]
  },
  "form": {
    "name": "Extract Q&A",
    "logoUrl": "g",
    "primaryColor": "#4285F4",
    "secondaryColor": "#00BCD4",
    "authorizationCheckFunction": "get3PAuthorizationUrls",
    "contextualTriggers": [
      {
        "unconditional": {},
        "onTriggerFunction": "buildAddOn"
      }
    ]
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
解决方案

报错的核心原因是Google Workspace插件的应用配置不能直接放在manifest根节点下,所有和插件功能相关的配置都要放在addOns字段下,form是addOns的子字段,不能直接写在根目录。
另外你的配置还有几处需要修正:

  • 你开发的是Forms提取工具,不需要AdSense高级服务,直接删掉对应的依赖配置,避免额外申请不必要的权限
  • logoUrl需要填写公共可访问的有效图片链接,当前填写的"g"是无效值,测试阶段可以先删除该字段
  • 你当前的功能代码中没有get3PAuthorizationUrls和buildAddOn两个函数,需要补充插件界面构建的相关逻辑,否则插件启动会报错
    修正后的manifest配置如下:
{
  "timeZone": "America/Los_Angeles",
  "dependencies": {},
  "addOns": {
    "form": {
      "name": "Extract Q&A",
      "primaryColor": "#4285F4",
      "secondaryColor": "#00BCD4",
      "contextualTriggers": [
        {
          "unconditional": {},
          "onTriggerFunction": "buildAddOn"
        }
      ]
    }
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

补充优化建议

如果只是个人使用该提取工具,不需要走正式的Workspace插件部署流程,直接给表单添加自定义菜单触发myFunction即可,操作更简单。另外可以把代码中写死的Form ID替换为FormApp.getActiveForm(),可以自动适配当前打开的表单,不用每次手动修改ID。

内容的提问来源于stack exchange,提问作者Roberto Flores

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:48:03