Google Apps Script: XLSX из Gmail в Google Sheets: неверный тип пантомимы. Тип контента выглядит как application / octet? - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь импортировать файл xlsx из вложения Gmail в Google Drive (как Google Sheet) с помощью скрипта Google Apps. Я пытался использовать Advanced Drive API в GAS, но при этом выдается следующее сообщение об ошибке:

Вызов API для drive.files.insert завершился ошибкой: указан неверный тип mime

Я выяснил, что вложение Gmail импортируется в Google Apps Script как application / octet вместо application / vnd.ms-excel, что, по-моему, является проблемой. Тем не менее, вложение - это файл xlsx, и я не понимаю, почему это будет распознано как application / octet.

Имейте в виду, я хочу преобразовать XLSX в Google Sheets. Поэтому мне нужен MimeType. Вот код:

 var mail  = GmailApp.search("XXXXXXX")[0];
  var msg = mail.getMessages()[0]
  var attachment = msg.getAttachments()[0];
  var blob =attachment
  var name = attachment.getName();
  var folderId = 'XXXXXX'; 

  var file = {
    title: 'Converted Spreadsheet',
   parents: [{id: folderId}],
    mimeType: MimeType.GOOGLE_SHEETS
  };
  file = Drive.Files.insert(file, blob, {convert: true})

У кого-нибудь есть идеи, как исправить ошибку или найти другой способ конвертировать этот XLSX в лист? Спасибо!

Ответы [ 2 ]

1 голос
/ 16 марта 2020
  • В вашей ситуации mimeType blob файла вложения равен application/octet.
  • blob на самом деле является файлом XLSX.
  • Когда blob application/octet используется с Drive.Files.insert(), возникает ошибка Invalid mime type provided.
  • Вы хотите преобразовать файл XLSX указанного выше блоба в электронную таблицу Google и создать его в виде файла.
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Проблема и обходной путь:

  • Когда mimeType для blob равен application/octet,
    • Когда Drive.Files.insert({title: 'Converted Spreadsheet', parents: [{id: "root"}], mimeType: MimeType.GOOGLE_SHEETS}, blob, {convert: true}) выполняется, возникает ошибка Invalid mime type provided.
    • При выполнении Drive.Files.insert({title: 'Converted Spreadsheet', parents: [{id: "root"}]}, blob, {convert: true}) ошибка не возникает. Но mimeType созданного файла - application/octet. Таким образом, файл не может быть открыт непосредственно на Google Drive. В этом случае требуется изменить mimeType созданного файла на XLSX. Я думаю, что причина этого кроется в This field can be left blank, and the mimetype will be determined from the uploaded content's MIME type.. Ref

В приведенном выше примере в этом ответе я хотел бы предложить установить mimeType для XLSX равным blob до того, как Drive.Files.insert будет запустите.

Модифицированный скрипт:

Когда ваш скрипт модифицирован, пожалуйста, измените его следующим образом.

От:

var blob =attachment

Кому:

var blob = attachment.setContentType(MimeType.MICROSOFT_EXCEL);  // MimeType.MICROSOFT_EXCEL or MimeType.MICROSOFT_EXCEL_LEGACY

или

Кому:

Если blob имеет имя файла с расширением, вы также можете использовать следующий скрипт. В этом случае mimeType автоматически задается расширением имени файла.

var blob = attachment.setContentTypeFromExtension();

Примечание:

  • В приведенном выше модифицированном скрипте результат одинаков с * и без mimeType: MimeType.GOOGLE_SHEETS in file.
  • В своем вопросе вы говорите an xlsx file from a Gmail Attachment. И вы говорите the Gmail attachment is imported to Google Apps Script as application/octet instead of application/vnd.ms-excel.
    • Если файл представляет собой файл XLSX, mimeType будет application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.
    • Если f ie является файлом XLS, mimeType будет application/vnd.ms-excel.

Ссылки:

Если это не помогло решить вашу проблему, прошу прощения.

0 голосов
/ 15 марта 2020

Эти

parents: [{id: folderId}],
mimeType: MimeType.GOOGLE_SHEETS

относятся к входному файлу. Смотрите документы здесь . Вы должны пропустить это.

Этот фрагмент работал для меня с Google Drive API v2:

function abc() {
  var mail = GmailApp.search("SEARCH_TERM")[0];
  var msg = mail.getMessages()[0];
  var blob = msg.getAttachments()[0];
  var file = {
    title: 'Converted Spreadsheet'
  };
  Drive.Files.insert(file, blob, {convert: true});
}
...