如何将数据从 Gmail 邮件附件复制到电子表格?

How to copy data from Gmail message attachment to a spreadsheet?

我正在尝试从位于共享电子邮件的特定文件夹中的 CSV 报告中获取数据,并将 Google 工作表中特定选项卡中的旧数据替换为新数据。

我已经尝试过不同的解决方案,但 none 似乎让我到达了我想要的位置。下面的代码是我生成的最干净的代码,但由于某种原因,它什么也没做。

我遵循的步骤:

  1. 打开文件夹所在的邮箱(共享邮箱,在Gmail中管理)
  2. 搜索所在的文件夹(label:rpt-its-all-data)
  3. 取最后收到的邮件
  4. 打开email/attachment
  5. 取数据
  6. 按 ID 打开 Google 个工作表
  7. 用当前日期更新选项卡 INFO 中单元格 B1 中的日期(我什至没有尝试将其整理出来)
  8. 打开选项卡 ALLDATA
  9. 在选项卡 ALLDATA 中粘贴值

这是Google张的副本,查看格式:https://docs.google.com/spreadsheets/d/1GyGxSwUtITeje0-Qx63rB8xChMSbLvn1FDCOKOJITio/edit?usp=sharing

我已经尝试过此代码:

function importCSVFromGmail() {
    var threads = GmailApp.search("id:AH1rexR2yzlanbk9GyP52tyVKSnXcMDz_miTs1-lLXtJwJB56l2r label:rpt-its-all-data");
    var message = threads[0].getMessages()[0];
    var attachment = message.getAttachments()[0];

    // Is the attachment a CSV file
    if (attachment.getContentType() === "text/csv") {
        var id = "1F_Z_00-ThdTRzlZ3nYd_pieJHkUjgye3pI_KJfydoP4";
        var name = "ALLDATA";
        var sheet = SpreadsheetApp.openById(id);
        var tab = sheet.getSheetByName(name);
      
        // Clear the content of the sheet
        tab.clearContents().clearFormats();
        tab.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
      
        var csvData = tab.Utilities.parseCsv(attachment.getDataAsString(), ",");
    }
}

使用上面的代码,我没有得到任何结果。我不确定为什么会这样。

我认为查询中的邮件 ID 不正确,无法调用该电子邮件,但我找不到任何其他方法。

我用这些更改修改了您的代码,因此它可以按预期工作:

1) 您遇到了错误,因为必须先声明 csvData 变量,然后才能使用它。此外,parseCsv() 函数来自 Utilities class,您可以直接使用此 class(您是这样调用它的:tab.Utilities.parseCsv)[1]。另一个问题是您无法使用消息 ID [2] 搜索消息,为此您应该发出获取请求 [3]。

2) 我放了一个 If 来验证邮件是否有附件。

3) 我更改了您的 If 中的条件以验证它是否是文件名中带有文件扩展名的 csv 文件,因为 gmail API 将带有 "application/octet-stream" 的 csv 文件作为 mime类型(我想这是因为你可以在 gmail 中将其作为 Google 表格打开)。

4) 我修改了您获取消息的方式以获取最后一个线程的最后一条消息,之前它是获取每个线程的第一条消息而不是最后一个。

5) 在INFO中设置日期sheet,如果需要特定格式可以查看formatDate函数[1].

function importCSVFromGmail() {
  var threads = GmailApp.search("label:rpt-its-all-data");
  var message = threads[0].getMessages().pop();

  var attachment = message.getAttachments()[0];

  if (attachment != null) {
    var attachName = attachment.getName();

    // Is the attachment a CSV file
    if (attachName.substring(attachName.length-4) === ".csv") {
      var id = "1bvENjFYC48LSYDMPtI4FIOKIChiuIrg5O4WRziFeAhU";
      var name = "ALLDATA";
      var sheet = SpreadsheetApp.openById(id);
      var tab = sheet.getSheetByName(name);
      var tabInfo = sheet.getSheetByName("INFO");
      tabInfo.getRange("B1").setValue(new Date());

      // Clear the content of the sheet
      tab.clearContents().clearFormats();
      var csvData = Utilities.parseCsv(attachment.getDataAsString(), ",");
      tab.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
    }
  } 
}

[1] https://developers.google.com/apps-script/reference/utilities/utilities#formatDate(Date,String,String)

[2]https://support.google.com/mail/answer/7190

[3] https://developers.google.com/gmail/api/v1/reference/users/messages/get