【问题标题】:Logging (lots of) Gmail Data into a Google Sheet将(大量)Gmail 数据记录到 Google 表格中
【发布时间】:2014-12-01 04:42:02
【问题描述】:

我的 Google App Script 的目标是将电子邮件中的所有基本数据在一定时间范围内(尚未实现)从所有标签中记录到 Google 表格中。

目前这在一定程度上有效。它将收集少量电子邮件,但如果我增加它(我有很多电子邮件要记录),如果我暂停 500 或 1000 毫秒(如下所示),此代码将‘Exceeded maximum execution time’,否则我点击另一个ratemax配额Service invoked too many times in a short time: gmail rateMax. Try Utilities.sleep(1000) between calls.

在下面的代码中,我相信我尝试使用 WHILE 循环重复主 FOR 循环 20 次,这是查看我是否可以执行此单次抓取 n 加载 var labelThreads = GmailApp.getUserLabelByName(label).getThreads(start, 1) 20 次的方法。这将是开始跟踪“批次”的一种方法——它不太奏效,我相信有更好的方法来解决这个问题,需要一些帮助。

function whenV24() {  
  function setColumnNames(range, columnNames){
    var cell = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange(range);
    cell.setValues(columnNames);
  }
  setColumnNames("A1:G1", [["Date","Label","To","From","Subject","Body","File Names"]]);
  betterGetV24();
}



  function betterGetV24() {
  var myspreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var mysheet = myspreadsheet.getSheets()[0];
  var threads = GmailApp.getInboxThreads();
  var messages = GmailApp.getMessagesForThreads(threads); 

  // ** LABEL NAME COLLECTION **  
  var labels = GmailApp.getUserLabels();

  // ** CREATE EMPTY DATA ARRAYS **
  var emailFrom = [];
  var emailTo = [];
  var emailBody = [];
  var emailDate = [];
  var emailLabel = [];
  var emailSubject = [];

  // ** LOAD "INBOX EMAIL DATA" INTO EMPTY ARRAYS **
  for(var i = 0; i < threads.length; i++) {
    emailBody.push([" "]);    
    emailFrom.push([messages[i][0].getFrom()]);
    emailTo.push([messages[i][0].getTo()]);
    emailSubject.push([messages[i][0].getSubject()]);
    emailDate.push([Utilities.formatDate(messages[i][0].getDate(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")]);
    emailLabel.push(["Inbox"]);
  };

  // ** LOAD "LABELED EMAIL DATA" INTO EMPTY ARRAYS **
  for (var l = 0; l < labels.length; l++) {                                       // ** Runs a for-loop over "labels array". 
      var label = labels[l].getName();                                            //    Gets "this" label name.       
      var start = 0; // sets start number as 0
      var tracker = 0;


    // this section of code has to loop based on a separate set of logic
    while (start < 20){
      tracker++;
      Logger.log("tracker :" + tracker);
        var labelThreads = GmailApp.getUserLabelByName(label).getThreads(start, 1); //    Gets threads in "this" label. (*Set Limits Here*) 
        var labelMessages = GmailApp.getMessagesForThreads(labelThreads);         //    Gets array with each email from "this" thread. 


        Utilities.sleep(500);       // pause in the loop for 500 milliseconds

        for (var t = 0; t <labelThreads.length; t++){                                 // ** Runs a for-loop over threads in a label. 
            Logger.log("part 1 - inside for-loop over message number: " + labelMessages[t][0].getId());
            Utilities.sleep(500);// **pause in the loop for 500 milliseconds

          if (labelMessages[t] == undefined){}      // If it's empty, skip.
            else {                                  // If it's not empty.
              Logger.log("part 2 - inside if statement in for-loop > push emailData into arrays");

              emailBody.push([" "]);    
              emailFrom.push([labelMessages[t][0].getFrom()]);
              emailTo.push([labelMessages[t][0].getTo()]);        
              emailDate.push([Utilities.formatDate(labelMessages[t][0].getDate(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")]);
              emailSubject.push([labelMessages[t][0].getSubject()]);
              emailLabel.push([labels[l].getName()]);
              mysheet.getRange(2,2,emailLabel.length,1).setValues(emailLabel);
          }
       }
      Logger.log("part 3 - outside if statement -> start += 2")
      var start = start + 3;
    }
      Logger.log("part 4 - outside while loop"); 

  }
  // ** THEN, LOG THE FILLED DATA ARRAYS TO ROWS **
  //getSheetValues(startRow, startColumn, numRows, numColumns)
  mysheet.getRange(2,4,emailFrom.length,1).setValues(emailFrom);
  mysheet.getRange(2,3,emailTo.length,1).setValues(emailTo);
  mysheet.getRange(2,1,emailDate.length,1).setValues(emailDate);
  mysheet.getRange(2,5,emailSubject.length,1).setValues(emailSubject);
  mysheet.getRange(2,6,emailBody.length,1).setValues(emailBody);
}

我认为此时我应该使用触发器,但似乎我还必须跟踪上一批记录的电子邮件并继续下一批。我也不知道如何将它与触发器联系起来。

感谢阅读。任何帮助表示赞赏。

编辑

我在此处错误地将数据设置到电子表格中。对于每个循环,我都试图在电子表格中设置数据。我不确定我是怎么做到的。只需将其移出循环并稍后设置即可解决我的问题。此处更新代码:http://pastie.org/9793256#96,100,109,117,123-125,131,135-139

    for (var t = 0; t <labelThreads.length; t++){                                 // ** Runs a for-loop over threads in a label. 
                    Logger.log("part 1 - inside for-loop over message number: " + labelMessages[t][0].getId());
                    Utilities.sleep(500);// **pause in the loop for 500 milliseconds

                  if (labelMessages[t] == undefined){}      // If it's empty, skip.
                    else {                                  // If it's not empty.
                      Logger.log("part 2 - inside if statement in for-loop > push emailData into arrays");

                      emailBody.push([" "]);    
                      emailFrom.push([labelMessages[t][0].getFrom()]);
                      emailTo.push([labelMessages[t][0].getTo()]);        
                      emailDate.push([Utilities.formatDate(labelMessages[t][0].getDate(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")]);
                      emailSubject.push([labelMessages[t][0].getSubject()]);
                      emailLabel.push([labels[l].getName()]);

// ** INCORRECTLY TRYING TO SET DATA PER LOOP **
                      mysheet.getRange(2,2,emailLabel.length,1).setValues(emailLabel);
                  }
               }

【问题讨论】:

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


    【解决方案1】:

    您可以使用 PropertiesService 在本地存储最后处理的电子邮件的索引。然后,您可以将“start”参数添加到 GmailApp.search() 方法以从最后一个位置开始搜索,并将整个事件设置为每 5 或 10 分钟触发一次。

    function myTrigger() {
      var start = PropertiesService.getScriptProperties().getProperty("startIndex");
      var threads = GmailApp.search("in:inbox", start, 200);
      for (var t in threads) {
         // Log the thread using your existing code
         start++;
      }
      PropertiesService.getScriptProperties().setProperty("startIndex", start);
    }
    

    【讨论】:

    • 我看了一点代码,但还没有时间尝试,今天我有几个小时,会研究一下。非常感谢您的建议!
    • 好的,我对这个应用程序进行了一些研究,虽然我认为我大致了解它,但我很难实现它。我想我需要找到一个工作示例来说明这是如何完成的,然后尝试对其进行调整。你的例子似乎太不像我的实现了,我现在无法理解如何使用它。仍在寻找
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 2015-12-29
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多