gsheet 脚本在编辑器中工作,而不是在按钮或菜单上

gsheet Script works in editor, not on a button or menu

我复制了一个脚本来提取某些电子邮件并将它们放在一个传播中sheet。如果 运行 在编辑器中,脚本工作正常,但如果我 运行 使用按钮(绘图)或菜单项,则不会写电子邮件。弹出窗口表明脚本是 运行ning 并且大约一半时间,电子邮件被标记为已读(如脚本中所写),但信息永远不会写入 sheet 除非 运行 来自编辑。我更喜欢按钮,但尝试菜单只是作为一种解决方法。

原始脚本在 saveEmails 中没有 SpreadsheetApp 行。我添加是因为我想 运行 打开脚本并从 onOpen 调用函数不起作用,所以我放弃了它并添加了一个触发器。需要添加 SpreadsheetApp 行才能使其正常工作。尝试将其添加到其他功能,但没有帮助。

我确实发现关于全局变量的信息,onOpen 需要在变量之前列出,但这似乎无助于让按钮工作。 代码如下。只改了个人资料。

function onOpen() {
    var ui = SpreadsheetApp.getUi();
    ui.createMenu("My Menu")
        .addItem("Update","saveEmails")
        .addToUi();
}
var SEARCH_QUERY = "label:TeacherLog is:unread from:username@mydomain.com newer_than:1d ";

// Credit: Alexander Ivanov
// https://gist.github.com/contributorpw/70e04a67f1f5fd96a708
// https://www.labnol.org/code/20053-save-gmail-to-google-spreadsheet


function getEmails_(q) {
    var emails = [];
    var threads = GmailApp.search(q);
    for (var i in threads) {
        var msgs = threads[i].getMessages();
        for (var j in msgs) {
            emails.push([
                msgs[j].getBody().replace(/<.*?>/g, '').replace(/^\s*/gm, '').replace(/^\s*/gm, '').replace(/\s*/gm, ''),
                msgs[j].getSubject(),
                msgs[j].markRead()
            ]);
        }
    }
    return emails;
}

function appendData_(sheet, array2d) {
    //if there are no emails to log, don't run 
    if (array2d.length == 0){}
    else {
        sheet.getRange(sheet.getLastRow() + 1, 1, array2d.length, array2d[0].length).setValues(array2d);
    }
}

function saveEmails() {
    SpreadsheetApp.getActiveSpreadsheet();
    var array2d = getEmails_(SEARCH_QUERY);
    if (array2d) {
        appendData_(SpreadsheetApp.getActiveSheet(), array2d);
    }
}

感谢任何帮助。只是希望人们能够单击按钮并提取任何新电子邮件。

建议

您可以试试下面这个更简单且不包含多个函数的脚本:

脚本:

var SEARCH_QUERY = "label:done from:mail-noreply@google.com "; //Edit it to your actual query

function saveEmails() {
  var ss = SpreadsheetApp.getActiveSheet();
  var threads = GmailApp.search(SEARCH_QUERY);

  for (var i=0; i<threads.length; i++)
  {
    var messages = threads[i].getMessages();
    for (var j=0; j<messages.length; j++)
    {
      var html = messages[j].getBody();
      var msg = getTextFromHtml(html);
      var sub = messages[j].getSubject();
      ss.appendRow([msg, sub]);
      messages[j].markRead();
    }
  }
}

function getTextFromHtml(html) { //Function to clean the body of the email & save it in pure text form
  html=html.replace(/<\/div>/ig, '\n');
  html=html.replace(/<\/li>/ig, '\n');
  html=html.replace(/<li>/ig, '  *');
  html=html.replace(/<\/ul>/ig, '\n');
  html=html.replace(/<\/p>/ig, '\n');
  html=html.replace(/<br\/?>/ig, '\n');
  html=html.replace(/<[^>]+>/ig, '');
  return html;
}

Note: I ave used some code from an answer at as reference.

测试结果:

  1. 已将 saveEmails 功能分配给测试中的按钮 sheet:

  1. 要在 sheet 上添加的示例电子邮件:

  1. 点击按钮后的sheet: