Google Apps Script - XLSX от электронной почты до указанных c Google Sheet - PullRequest
0 голосов
/ 11 февраля 2020

Ежедневно я получаю электронное письмо с файлом XLSX, который мне нужно экспортировать в указанный c Google Sheet. Код просто ищет в GMAIL определенный c запрос, где он затем получает тело (которое содержит URL), которое затем загружается с помощью функции doGet, которая использует Url.FetchApp.fetch(url).getBlob()

После этого используя переменную fileInfo, он определяет заголовок, mimeType файла и «parent», который является идентификатором папки, в которую мне нужно поместить преобразованный файл.

Затем я вставляю файл с Drive.Files.insert(fileInfo, file, {convert: true}), который должен конвертировать мой файл Excel и поместить его в мою папку. Экспорт работает (файл экспортируется). Если я добавляю расширение .xlsx вручную и пытаюсь открыть его в Excel, он открывается совершенно со всей необходимой информацией.

Но проблема в том, что мне не нужно открывать файл Excel, поэтому я пытаюсь экспортировать его в Google Sheet или даже проанализировать как CSV, но он не работает.

При попытке открыть этот экспортированный файл по идентификатору, он говорит, что он отсутствует или отсутствует " у меня нет разрешений, но они есть, и у меня есть разрешения. При проверке MIME-типа файла выдается «application / x-zip».

Можно ли в любом случае загрузить данные файла в свой лист Google с идентификатором «1HMXgJuuRFaGK11sfR38mKh6rk4ta_Qgtlljk6HBjLkE»?

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 ]

1 голос
/ 12 февраля 2020

Кажется, вам нужно использовать правильный тип 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' }],
  }

;

Также вы не можете использовать doGet, как вы используете сейчас. doGet является зарезервированной функцией.

0 голосов
/ 12 февраля 2020

Оказывается, я также должен был установить mimetype в функции doGet для mimetype xlsx, чтобы он работал.

В качестве оптимизации я также удалил спецификацию mimetype в переменной info файла.

Мне удается использовать эту функцию doGet, несмотря на то, что она зарезервирована, поэтому я думаю, что буду придерживаться ее на данный момент?

Что касается прямого вызова API диска, мне нужно использовать расширенный сервис, чтобы иметь возможность конвертировать файл xlsx.

...