【问题标题】:Google Apps Script error 'Bad Request' when transferring a .xlsm-file to a GSheet将 .xlsm 文件传输到 GSheet 时出现 Google Apps 脚本错误“错误请求”
【发布时间】:2020-04-29 09:17:39
【问题描述】:

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

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

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

代码如下:

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. 

【问题讨论】:

  • 您能否添加行Logger.log(message.getSubject());,然后从Gmail UI 中识别带有主题的电子邮件。查看附件,看看可以转换的附件和不能转换的附件有什么区别。

标签: google-apps-script google-sheets gmail email-attachments xlsm


【解决方案1】:

我相信你的目标如下。

  • 您想将 .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用Drive APIRef中的“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 文件时,宏不包括在内。我认为这是规范。所以请注意这一点。

参考:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多