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

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"
      }
    ]
  }
}
<!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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:35:27