Google 将 .xlsm 文件传输到 GSheet 时出现 Apps 脚本错误 'Bad Request'

Google Apps Script error 'Bad Request' when transferring a .xlsm-file to a GSheet

我的收件箱中有一个 Excel-文件 (.xlsm) 作为 Gmail 附件,我想将其传输到 GDrive。它应该保存为 GSheet。我正在尝试使用 Apps 脚本自动执行此过程。

不幸的是,我在启动脚本时遇到错误。 (API 对 drive.files.insert 的调用失败,出现错误:错误请求) 这很奇怪,因为脚本运行了几次并且文件可以毫无问题地转换。上周,当我将带有附件的邮件转发给某人时,它就起作用了(不要问我上下文在哪里)。但是现在,这一切都成为历史,我不知道如何修复错误。

我是 Whosebug 的新手,我非常期待您的每一个回答。非常感谢。

代码如下:

function importFunction() {

  var threads =  GmailApp.search('CC520_Report_Lukas_GAS_ABC');                             
  var messages = threads[0].getMessages();    
  var message = messages[0];                                                                
  var attachment = message.getAttachments()[0];                                            

  var resource = {
    title: 'NewFileLukas',                                
    mimeType: MimeType.GOOGLE_SHEETS,
    parents: [{id: 'xxxxx6BD1SIfI0Cz5bmGahzSlHUxxxxxx'}], 
};

var insert = Drive.Files.insert(resource, attachment);      // Here comes the error. 

我相信你的目标如下。

  • 您想将 .xlsm 文件转换为 Google 电子表格。
  • attachment您使用的是.xlsm文件。
  • 在您的情况下,API call to drive.files.insert failed with error: Bad Request 的错误发生在 Drive.Files.insert(resource, attachment)
    • 您想删除此错误。

为此,这个答案怎么样?我也遇到过同样的问题。

修改点:

  • .xlsm 文件的 mimeType 是 application/vnd.ms-excel.sheet.macroenabled.12。在您的脚本中,当使用 console.log(attachment.getContentType()) 时,如果 attachment.xlsm 文件,则返回此类 mimeType。
  • importFormats在DriveAPIRef中用"About: get"的方法确认后,好像application/vnd.ms-excel.sheet.macroenabled.12可以转换成application/vnd.google-apps.spreadsheet.这可以在 Drive API v2 和 v3 中看到。
    • 但是,当application/vnd.ms-excel.sheet.macroenabled.12数据被用于Drive.Files.insert(resource, attachment)时,会出现错误。在这种情况下,我确认即使我使用 Drive API v3 对此进行测试,也会出现同样的问题。
    • 我以为这个转换可能还没有反映出来。另外我相信在以后的更新中会对此进行修改。

因此,作为当前的解决方法,我建议通过更改 blob 的 mimeType 将 .xlsm 文件转换为 Google 电子表格。

修改后的脚本:

当您的脚本修改时,请修改如下。

从:
var attachment = message.getAttachments()[0];
到:
var attachment = message.getAttachments()[0].setContentType(MimeType.MICROSOFT_EXCEL);

var attachment = message.getAttachments()[0];
if (attachment.getContentType() == "application/vnd.ms-excel.sheet.macroenabled.12") {
  attachment.setContentType(MimeType.MICROSOFT_EXCEL);
}

注:

  • 在我的环境中,我可以确认通过将 mimeType 更改为 MimeType.MICROSOFT_EXCEL.xlsm 文件可以转换为 Google 电子表格。
  • 在这种情况下,.xlsm 文件的宏不会转换为 Google Apps 脚本。而且,在 .xlsm 文件转换为 Google 电子表格后,当 Google 电子表格转换为 excel 文件时,不包含宏。我认为这就是规范。所以请注意这一点。

参考: