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
相关产品推荐
相关产品推荐

