如何使用Google Apps脚本将数据从gmail附件复制到工作表?

时间:2019-07-26 13:47:52

标签: google-apps-script

我敢肯定这很简单,但是作为一个初学者,我发现我找不到解决问题的方法。

我正在尝试从共享电子邮件中特定文件夹中的csv报告中获取数据,并用新数据替换Google表格中特定标签中的旧数据。

我已经尝试过不同的解决方案,但是似乎没有一个可以让我满意。下面的代码是我生成的最干净的代码,但是由于某种原因,它没有执行任何操作。

我遵循的步骤:

  1. 打开文件夹所在的电子邮件(它是共享电子邮件,以gmail管理)
  2. 搜索所在的文件夹(标签:rpt-its-all-data)
  3. 接受上一封收到的电子邮件
  4. 打开电子邮件/附件
  5. 获取数据
  6. 按ID打开Goog​​le表格
  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不能正确调用该电子邮件,但是找不到其他方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

我通过这些更改修改了您的代码,使其可以按预期工作:

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

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

3)我更改了“如果”条件,以验证它是否是文件名中带有文件扩展名的csv文件,因为gmail API接收的csv文件的MIME类型为“ application / octet-stream”(我想这是因为您可以将其作为Gmail中的Google表格打开。

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

5)在INFO表中设置日期,如果需要特定格式[1],则可以检查formatDate函数。

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

答案 1 :(得分:0)

  

将附件从csv转换为字符串可能会引发错误。

考虑在这里找到的答案:Copy a range from a csv file to a Google Spreadsheet