【问题标题】:Automatically create Gmail sublabels based on extracted substring in email subject (Google Script)根据提取的电子邮件主题中的子字符串自动创建 Gmail 子标签(Google 脚本)
【发布时间】:2021-05-31 03:17:28
【问题描述】:

我是谷歌脚本的新手。

我一直在尝试根据从电子邮件主题中提取的特定 ID 或数字自动为我从供应商处收到的电子邮件添加子标签。

例如,电子邮件主题是“供应商 A(供应商 ID:12349)”。因此,在父标签“供应商”下,我试图将 12349 作为引用该特定 ID 的线程或消息的子标签。一旦 Gmail 收到主题内的新 ID,就会自动创建子标签,并且会自动使用已创建的子标签 ID 标记新传入的电子邮件。

我通过参考其他论坛主题尝试了很多事情,但没有一个有效。我想我能得到的最接近的方法是让脚本引用工作表中的某一列,我用它来提取 ID 号并根据该特定行创建标签。但是,我不断收到错误,因为 GmailApp.createLabel("") 需要 ("") 中的名称/字符串。

以下是目前的脚本:

//retrieve gmail messages
function GatherEmails() {
    let messages = getGmail();

    let curSheet = SpreadsheetApp.getActive().getSheetByName('SupplierEmails');

    messages.forEach(message => {curSheet.appendRow(parseEmail(message))});
}

function getGmail() {
    const query = "NOT label:Bounced/Out of Office";

    let threads = GmailApp.search(query);

    let label = GmailApp.getUserLabelByName("Supplier");
    
    let messages = [];

    threads.forEach(thread => {
        messages.push(thread.getMessages()[0].getPlainBody());
       
    });

    return messages;
}

//call cell value by column (Sheet: "Supplier Labels")
function callLabelcolum() 
{
  var ss1=SpreadsheetApp.getActive();
  var sh=ss1.getSheetByName("Supplier Labels");
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var hA=vA[0];
  for(var i=1;i<vA.length;i++)
  {
    var row="";
    for(var j=0;j<vA[0].length;j++)
    {
      row[hA[j]]=vA[i][j];
    }
    Logger.log('Label: %s',row.Label);
    
  }

}

//parse & label the email massage
function parseEmail(messages, row) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("SupplierEmails");

    var threads = GmailApp.search('');
  
          
  for (var i = 0; i < threads.length; i++){
    var msg = threads[i].getMessages();
    for (var j = 0; j < msg.length; j++){
      
      // Get same thread by its ID.
      var threadID = GmailApp.getThreadById(msg[j].getId());

      // Logs the permalink for the first thread in the inbox
      var thrd = GmailApp.getInboxThreads(0,1)[0];
      var link = thrd.getPermalink();
      
      var date = msg[j].getDate();
      var from = msg[j].getFrom();
      var subj = msg[j].getSubject();
      var pmsg = msg[j].getPlainBody();
      var msgid = msg[j].getId();
      var msglink = "https://mail.google.com/mail/u/0/#inbox/"+msg[j].getId();
          
            
      // Creates the label and logs label: callLabel()
      Logger.log("label: " + GmailApp.createLabel(row));

      sheet.appendRow([from, msgid, subj, msglink]);

    }
  }
} 

这是我用来创建标签的方法,但有错误:

Logger.log("label: " + GmailApp.createLabel(row));

错误:Exception: Invalid argument: name + 运行后在 gmail 中未创建标签

Exception: Invalid argument: name (Message Details)

那么无论如何我可以做到这一点吗?或者还有其他我可能错过的方法吗?

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 如何调用 parseLabel()。你没有提供任何例子。我也认为这个Logger.log("label: " + GmailApp.createLabel(row)); 应该是这个Logger.log("label: " + GmailApp.createLabel(row)).getName();
  • 你能定义你得到的错误吗?
  • @Cooper parseLabel()?你的意思是 parseEmail()?如果是这样,我已经编辑了脚本的上半部分以显示我所做的当前脚本。我也试过你提到的方法,当我试图在谷歌表上收集电子邮件时出现同样的错误(异常:无效参数:名称)
  • @RafaGuillermo 我得到的错误是“异常:无效参数:名称”。当我尝试将电子邮件收集到电子表格中时,它出现在页面顶部。虽然,当我在脚本编辑器中运行脚本时没有检测到错误..
  • @Cooper 抱歉,我不太明白你的问题?但是,如果您需要我更具体地说明错误。我在问题中添加了错误图片

标签: google-apps-script google-sheets gmail label


【解决方案1】:

这是我发现方法问题后所做的。

澄清一下,创建的标签只是基于单元格值的空标签,因此没有分配线程或过滤器。但是,它确实解决了我遇到的错误。

function callLabelcolumn() 
{
  var ss = SpreadsheetApp.getActive();
  
  var sh = ss.getSheetByName('Supplier Labels');
  var rg=sh.getRange('A2:A');
  var vA=rg.getValues();

  
  vA.forEach(function(row) {
  if(row != "" && row != "#N/A"){
   
   Logger.log('Label: %s', row);
    var label = GmailApp.createLabel(row);
    
   Logger.log("label: " + label);
             
   }  

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多