Google Apps脚本-从电子邮件发送到特定Google表格的XLSX

时间:2020-02-11 13:15:22

标签: google-apps-script google-apps

我每天都会收到一封包含XLSX文件的电子邮件,然后将其导出到特定的Google表格。 该代码只是在GMAIL中搜索特定查询,然后在其中获取正文(包含URL),然后使用Url.FetchApp.fetch(url).getBlob()

的doGet函数将其下载。

然后,使用变量fileInfo定义文件的标题,mimeType和“父项”,这是我需要在其中存储转换后的文件的文件夹的ID。

然后,我插入带有Drive.Files.insert(fileInfo, file, {convert: true})的文件,它将转换我的Excel文件并将其存放在我的文件夹中。 导出有效(导出文件)。如果我手动附加.xlsx扩展名并尝试在Excel中打开,则它会完美打开并包含所有必需的信息。

但是,问题是我不需要在Excel文件中打开,因此我试图将其导出到Google表格,甚至将其解析为CSV格式,但无法正常工作。

当尝试通过ID打开此导出文件时,它说它丢失或没有权限,但是它在那里并且我确实具有权限。 检查文件的MIME类型时,它显示为“ application / x-zip”。

反正我是否可以将文件数据上传到ID为“ 1HMXgJuuRFaGK11sfR38mKh6rk4ta_Qgtlljk6HBjLkE”的Google表格中?

function CostDSP() {

  var sheetId="1HMXgJuuRFaGK11sfR38mKh6rk4ta_Qgtlljk6HBjLkE";

   var threads = GmailApp.search("from:no-reply@amazon.com subject:Cost - DSP  in:inbox newer_than:1d");
    var message = threads[0].getMessages()[0];
    var attachment = message.getPlainBody();


  var regex= new RegExp("\<(.*)\>");
  var url=regex.exec(attachment)[1];
  Logger.log(url);

  var file=doGet(url);

  var fileInfo = {
    title: "Cost - DSP",
    mimeType: "MICROSOFT_EXCEL",
    "parents": [{'id': "19jrt0DyfvsDz5WAdKhkekHkJ_wP7qP7f"}],
};


Drive.Files.insert(fileInfo, file, {convert: true});

var sourceFile = DriveApp.getFilesByName("Cost - DSP").next(); 
Logger.log(sourceFile.getMimeType());
Logger.log(sourceFile);



var source=SpreadsheetApp.openById("1lIVb9YM9IK7f8dKuC1RpXjP7nLnMNXm1");
var sheet = sourceFile.getSheets()[0];
var destination = SpreadsheetApp.openById("1HMXgJuuRFaGK11sfR38mKh6rk4ta_Qgtlljk6HBjLkE").getSheetByName('Data Intake');
sheet.copyTo(destination);

  }




function doGet(e) {
    // e.parameter["file"] //returns ?file=filelink.com/file.xlsx

   var file = UrlFetchApp.fetch(e).getBlob();
  return file;

}

2 个答案:

答案 0 :(得分:1)

似乎您需要使用正确的mime类型进行导入

mimeType:
  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',

下一个代码对我来说很好

var file = UrlFetchApp.fetch(
  'https://ec.europa.eu/eurostat/statistics-explained/images/9/9f/Country_Codes_and_Names.xlsx'
);

var fileInfo = {
  title: 'Cost - DSP',
  mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  parents: [{
    id: 'root'
  }],
};

Drive.Files.insert(fileInfo, file, {
  convert: true
})

就像@Raserhin所说的那样,它无需使用mimeType参数。

  var fileInfo = {
    title: 'Cost - DSP',
//    mimeType:
//      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    parents: [{ id: 'root' }],
  }

;

此外,您不能像现在使用的那样使用doGetdoGet是保留功能。

答案 1 :(得分:0)

结果,我还必须将doGet函数中的mimetype设置为xlsx mimetype才能起作用。

作为优化,我还删除了文件info变量中的mimetype规范。

尽管保留了它,但我仍设法使用此doGet函数,所以我想我现在会坚持吗?

至于直接调用驱动器api,我需要使用高级服务才能转换xlsx文件。