我敢肯定这很简单,但是作为一个初学者,我发现我找不到解决问题的方法。
我正在尝试从共享电子邮件中特定文件夹中的csv报告中获取数据,并用新数据替换Google表格中特定标签中的旧数据。
我已经尝试过不同的解决方案,但是似乎没有一个可以让我满意。下面的代码是我生成的最干净的代码,但是由于某种原因,它没有执行任何操作。
我遵循的步骤:
这是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不能正确调用该电子邮件,但是找不到其他方法。
谢谢!
答案 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);
}
}
}
[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