【问题标题】:Google Apps Script Why it only searches for one (first) attachmentGoogle Apps 脚本为什么它只搜索一个(第一个)附件
【发布时间】:2020-02-21 18:29:55
【问题描述】:

我有两个代码,第一个有效并显示所有附件,第二个仅显示第一个。 “getAttachmentAndMessage”被我的几个脚本使用,所以我需要将它放在一个单独的函数中,以免重复我的配置。请帮忙。

//this function get me all attachments
//this function is just an example of how I built my code below; 
function searchEmailsData(){
  var search = GmailApp.search('in:inbox newer_than:3d');
  var threads = GmailApp.getMessagesForThreads(search);
  for (var i = 0 ; i < threads.length; i++) {
    var thread = threads[i];

    for (var j = 0; j < thread.length; j++) {
      var message = thread[j];
      var attachments = message.getAttachments();

      for (var k = 0; k < attachments.length; k++) {        
        var attachment = attachments[k];
        Logger.log(attachment.getName());
      }
    }
  }
}

//this functions get me only first attachment but I need all of them;
function searchEmailsData2(){
  var search = GmailApp.search('in:inbox newer_than:3d');
  var threads = GmailApp.getMessagesForThreads(search);
  for (var i = 0 ; i < threads.length; i++) {
    var thread = threads[i];    
    var obj = getAttachmentAndMessage(thread);    
    Logger.log(obj[1].getName())
  }
}

function getAttachmentAndMessage(thread){ 

  for (var j = 0; j < thread.length; j++) {
    var message = thread[j];

    var attachments = message.getAttachments();

    for (var k = 0; k < attachments.length; k++) {
      var attachment = attachments[k];
      var obj = [message, attachment];

      return obj;     
    }
  }
}

【问题讨论】:

  • 这里的问题不是很清楚。如果您添加对哪些问题无法正常工作、当前结果是什么以及您的预期结果的解释,将会有所帮助。
  • 您的getAttachmentAndMessage 函数只返回一个附件——它找到的第一个附件。所以...不要那样做。
  • 正如我所说的,我的 getAttachmentAndMessage 函数只返回单个附件,我需要的是返回所有附件,如函数 searchEmailsData
  • @vipmaciej 您正在将 thread 传递给您的 getAttachmentAndMessage() 函数。你期望它返回什么?线程的第一条消息及其所有附件?或者更确切地说,它包含的每条消息以及它们每个包含的每个附件?干杯
  • 我希望线程中的每条消息以及每个消息中包含的每个附件。就像在函数 searchEmailsData() 中一样

标签: google-apps-script gmail-api


【解决方案1】:

为了不返回第一个附件而是全部返回,可以修改getAttachmentAndMessage()函数如下:

function getAttachmentAndMessage(thread) { 
  var results = [];

  for (var j = 0; j < thread.length; j++) {
    var message = thread[j];
    var attachments = message.getAttachments();

    var obj = {'message': message, 'attachments': attachments};
    results.push(obj);
  }

  return results;
}

上面会返回一个对象列表,其中每个对象包含一个属性message,和一个属性attachments(即附件列表)。

为了返回包含线程中附件的列表,您可以使用上面代码的以下变体:

function getAttachmentAndMessage(thread) { 
  var results = [];

  for (var j = 0; j < thread.length; j++) {
    var message = thread[j];
    var attachments = message.getAttachments();

    results = results.concat(attachments);
  }

  return results;
}

您的原始代码

在您原来的 getAttachmentAndMessage() 代码中,您在 for 循环中使用了 return 语句。这意味着在找到第一条消息(外循环的第一次迭代)和找到它的第一个附件(内循环的第一次迭代)时,该函数将简单地返回一个值,该值是一个包含第一条消息及其第一个附件的列表.

【讨论】:

  • 它不起作用:“无法调用未定义的方法“getName””
  • @vipmaciej 此答案中没有 getName 方法调用?
  • @vipmaciej 您在原始问题中的Logger.log(obj[1].getName()) 行(searchEmailsData2() 函数内部似乎是导致您所描述问题的原因。考虑将其替换为以下Logger.log(obj) 以记录函数返回的整个列表,或Logger.log(obj[0]) 记录返回列表的第一项。干杯
  • 这个 Logg 本身不是问题。如果我使用 searchEmailsData 函数,我得到它 GmailAttachment * X(取决于我有多少附件)当我使用你的代码时,我得到 [{attachments=[GmailAttachment, GmailAttachment, GmailAttachment, GmailAttachment], message=GmailMessage}] [{attachments= [GmailAttachment, GmailAttachment], message=GmailMessage}] [{attachments=[GmailAttachment], message=GmailMessage}] [{attachments=[GmailAttachment], message=GmailMessage}]
  • @vipmaciej 我已经编辑了符合您要求的代码。让我知道这是否适合你。干杯
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多