首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Google自动转发EMails

使用Google自动转发EMails
EN

Stack Overflow用户
提问于 2021-08-16 23:07:21
回答 2查看 169关注 0票数 0

我用gmail学习Javascript。我知道可能有其他的方法,但我想找出这一个,主要是为了了解我的思维过程是错误的。我的目标是学习JavaScript和Google。

我在gmail中用一个特定的标签标记电子邮件,最后我想把所有这些电子邮件转发给一个特定的人。人的变化取决于谁在做工作。我所希望的是:

  • 脚本转到Google查找列、A客户端名称、要转发的B电子邮件、C当前标签和D标签将其存档到。(示例: A: Fire Club,B: example@fireclub.co,C:收件箱/火俱乐部,D: example@fireclub.co电子邮件,附件将主题更改为“客户名称-旧主题”(即从“烧毁”改为"Fire Club - Burn it“
  • 消息)然后从初始标签(C栏)中移除,并用其新标签(D栏)

标记。

下面是我所拥有的,再次,我知道我可以清理其中的一些(例如,改变columnB成为收件人),但我还不能让核心工作。当我尝试运行下面的代码时,它将遍历标签中大约一半的消息,然后返回"TypeError:无法读取未定义的myFunction @Code.js:21的属性“--这是实际发送消息的行。

代码语言:javascript
复制
        threads[i].getMessages()[i].forward(recipient, {subject: subject}); // Sends e-mail

谢谢你的帮助。我已经包含了下面的全部代码,以防它不仅仅是上面的一行。谢谢!

代码语言:javascript
复制
function myFunction() {

  var sheetID = 'ID'; //Edit this to your sheet ID.
  let sheet = SpreadsheetApp.openById(sheetID);
  let rowNum = 6; //Need to make this match to labels, but good enough for a POC
  var values = sheet.getActiveSheet().getDataRange().getValues();
  let columnA = values[rowNum][0]; // get column A - Client Name
  let columnB = values[rowNum][1]; // get column B - email
  let columnC = values[rowNum][2]; // get column C - label
  let columnD = values[rowNum][3]; // get column D - archive

// Grab E-Mails to send
  var labels = GmailApp.getUserLabelByName(columnC);
  var archive = GmailApp.getUserLabelByName(columnD);
  var threads = labels.getThreads();
  var length = threads.length;
  let recipient = columnB;
  for (let i = 0; i < length; i++) {
    let subject = columnA + ' - ' + threads[i].getFirstMessageSubject();
    threads[i].getMessages()[i].forward(recipient, {subject: subject}); // Sends e-mail
    Logger.log("Thread ID: " + threads[i].getId() + " Message Sent: " + columnA + " - " + threads[i].getFirstMessageSubject()) // Changes subject to add Client name in front
    archive.addToThread(threads[i]); // Adds the label that is shown in dolumn D of the spreadsheet
    labels.removeFromThread(threads[i]); // removes the inbox label
  }
}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-17 02:32:00

您试图使用相同的索引i来获取线程和其中的消息,但是线程可能有不同数量的消息。例如,第10个线程可能只有5条消息,所以如果您尝试访问该线程的第10条消息,您将得到undefined

如果您试图获取线程的第一条消息(例如,如果它只有一条消息),那么您可以使用getMessages()[0]

如果要转发所有消息,则需要遍历getMessages()检索的消息。

代码语言:javascript
复制
for (let i = 0; i < length; i++) {
  let subject = columnA + ' - ' + threads[i].getFirstMessageSubject();
  let messages =  threads[i].getMessages();
  for (let j = 0; j < messages.length; j++) {
    messages[j].forward(recipient, {subject: subject}); // Sends e-mail
    Logger.log("Thread ID: " + threads[i].getId() + " Message Sent: " + columnA + " - " + threads[i].getFirstMessageSubject()) // Changes subject to add Client name in front
    archive.addToThread(threads[i]); // Adds the label that is shown in dolumn D of the spreadsheet
    labels.removeFromThread(threads[i]); // removes the inbox label
  }
}

根据具体情况,还可以包含一个IF语句,以仅转发满足特定条件的消息。

票数 0
EN

Stack Overflow用户

发布于 2021-08-17 02:37:59

代码语言:javascript
复制
function myFunction1() {
  const ss = SpreadsheetApp.openById("sheetID");
  const sh = ss.getActiveSheet();
  const vs = sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getValues();
  vs.forEach((r, i) => {
    let recipient = r[1];
    let labels = GmailApp.getUserLabelByName(r[2]);
    let archive = GmailApp.getUserLabelByName(r[3]);
    let threads = labels.getThreads();
    threads.forEach(t => {
      let subject = `${r[0]} - ${t.getFirstMessageSubject()}`;
      t.getMessages().forEach(m => {
        m.forward(r[1], { subject: subject });
        archive.addToThread(t);
        labels.removeFromThread(t);
      });
    });
  });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68810040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档