HtmlService创建的Spreadsheet侧边栏无法调用App Script代码求助
Gmail Modify权限下App Script侧边栏无法触发后端函数问题
我开发了一款App Script脚本,实现了带输入框和提交按钮的交互式侧边栏。点击提交按钮本应调用GS文件中的extractEmailAndAddToSheet函数,但该功能仅在配置https://mail.google.com/权限域时正常工作。Google插件支持团队要求改用https://www.googleapis.com/auth/gmail.modify权限域,我单独测试过所有函数和Google API,在modify权限域下都能正常运行,但整合后HTML脚本无法触发GS中的代码。
manifest 文件
{ "timeZone": "Asia/Kolkata", "dependencies": { "enabledAdvancedServices": [ { "userSymbol": "Gmail", "version": "v1", "serviceId": "gmail" }, { "userSymbol": "Sheets", "version": "v4", "serviceId": "sheets" } ] }, "exceptionLogging": "STACKDRIVER", "oauthScopes": [ "https://www.googleapis.com/auth/script.container.ui", "https://www.googleapis.com/auth/gmail.modify", "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/script.external_request", "https://www.googleapis.com/auth/userinfo.email" ], "runtimeVersion": "V8", "sheets": { "macros": [ { "menuName": "onInstall", "functionName": "onInstall" } ] } }
sidebar.html
<!DOCTYPE html> <html> <head> <base target="_top"> </head> <script> function doPost() { var ignorelist = document.getElementById('IgnoreList').value; google.script.run.extractEmailAndAddToSheet(ignorelist); } </script> <body> <div> <label>Emails from below senders will be ignored</label> <textarea class="form-control" id="IgnoreList" rows="25" style="width: 100%;resize: none; zoom:100%" onwheel="this.style.zoom = parseInt(this.style.zoom) + event.deltaY * 0.001 + '%'"><?= message1 ?></textarea> <button type="submit" style="width: 100%; height: 50px; font-size: 20px;" onclick="doPost();">Submit</button> </div> </body> </html>
code.gs
function onInstall() { onOpen() } function onOpen() { SpreadsheetApp .getUi() .createMenu("7Targets GMail™ Contacts Extractor") .addItem("7Targets GMail™ Contacts Extractor", "showSidebar") .addToUi(); } function showSidebar() { var original_ignore_email_list = get_active_user_org(); var ui = SpreadsheetApp.getUi(); var template = HtmlService.createTemplateFromFile("drawer"); template.message1 = original_ignore_email_list; var html = template.evaluate().setTitle("Extract Contacts from GMail"); ui.showSidebar(html); } function extractEmailAndAddToSheet(ignore_email_list) { var user_email = Session.getActiveUser().getEmail(); var sheet = SpreadsheetApp.getActiveSheet() Logger.log("Sheet activated" + sheet); Logger.log("logging the emails to be ignored: " + ignore_email_list); var start_index = 0; do { var emails = GmailApp.search("newer_than:100000d AND in:inbox", 0, 2); start_index = start_index + 500; var label = "Scanned"; GmailApp.createLabel(label); var label_id = get_label_id(user_email, label); Logger.log("Label id " + label_id); var messages = []; var no_of_messages_per_email = []; for (var i = emails.length - 1; i >= 0; i--) { messages = messages.concat(emails[i].getMessages()); emails[i].getMessages().forEach(function () { no_of_messages_per_email.push(emails[i].getMessages().length); }) } Logger.log("Logging no of emails: " + emails.length); Logger.log("Logging no of threads: " + messages.length); for (var m = 0; m < messages.length; m++) { var message_id = messages[m].getId(); var check = check_if_message_has_label(user_email, message_id, label_id); if (check) { continue; } var from_email = messages[m].getFrom(); Logger.log("data obtained from 'from' section: " + from_email); var plain_email_body = messages[m].getPlainBody(); var from_email_id = process_from_mail(from_email, sheet, plain_email_body, ignore_email_list); Logger.log("From section processing completed"); var to_mail = messages[m].getTo(); Logger.log("data obtained from 'to' section: " + to_mail); process_to_mail(to_mail, sheet, ignore_email_list, no_of_messages_per_email[i], user_email, from_email_id); Logger.log("To section processing completed"); var cc = messages[m].getCc(); Logger.log("data obtained from 'cc' section: " + cc); process_cc_mail(cc, sheet, ignore_email_list); Logger.log("CC section processing completed"); add_label_to_message(user_email, message_id, label_id); } } while (start_index < 5000); }
解决方案
1. 添加前端错误捕获,定位具体问题
google.script.run默认会静默失败,添加错误处理函数可以直接看到触发失败的原因:
修改sidebar.html中的doPost函数:
function doPost() { var ignorelist = document.getElementById('IgnoreList').value; google.script.run .withFailureHandler(function(error) { alert('执行失败: ' + error.message); console.error('错误详情:', error); }) .withSuccessHandler(function() { alert('处理完成!'); }) .extractEmailAndAddToSheet(ignorelist); }
2. 修复重复创建标签的错误
GmailApp.createLabel如果标签已存在会抛出异常,导致函数中断,修改code.gs中相关代码:
var label = "Scanned"; // 先检查标签是否存在,不存在再创建 var existingLabel = GmailApp.getUserLabelByName(label); if (!existingLabel) { existingLabel = GmailApp.createLabel(label); } var label_id = get_label_id(user_email, label);
3. 确认侧边栏模板文件名一致性
在showSidebar函数中,你调用的是HtmlService.createTemplateFromFile("drawer"),但提供的HTML文件名为sidebar.html,如果实际文件名是sidebar.html,需要修改为:
var template = HtmlService.createTemplateFromFile("sidebar");
4. 重新授权权限
权限更新后可能需要重新授权:
- 卸载当前插件,重新安装
- 在脚本编辑器中点击「运行」→「测试权限」,重新完成授权流程
5. 检查依赖函数的权限兼容性
确认extractEmailAndAddToSheet中调用的get_active_user_org、get_label_id、check_if_message_has_label等函数,是否全部兼容gmail.modify权限,避免这些函数中使用了超出权限范围的API调用。
内容的提问来源于stack exchange,提问作者Mia Jessy
相关产品推荐
相关产品推荐

