Определение расширения вложения электронной почты автоматически (будь то XLSX или CSV) и применение правильного метода анализа - PullRequest
1 голос
/ 06 мая 2019

У меня есть два кода Google Script, которые автоматизируют процесс импорта вложений электронной почты из Gmail (он автоматически помечается) в Google Sheets.Пока мне удалось заставить его работать отдельно для файлов CSV и XLSX.Пожалуйста, смотрите оба кода ниже.У меня вопрос: как мне объединить эти два кода в один, чтобы он мог автоматически определять расширение файла и применять правильную технику разбора при копировании содержимого файлов в соответствующем Google Sheet.Спасибо!

Для файлов XLSX:

function getXLSX() {

var thread = GmailApp.getUserLabelByName("Invoicing").getThreads(0,1);

/* var message = thread[0].getMessages()[0]; // Get first message */
var messages = thread[0].getMessages();
var len = messages.length;
var message=messages[len-1] //get last message
var attachments = message.getAttachments(); // Get attachment of first message

var xlsxBlob = attachments[0]; // Is supposes that attachments[0] is the blob of xlsx file.
var convertedSpreadsheetId = Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS}, xlsxBlob).id;
var sheet = SpreadsheetApp.openById(convertedSpreadsheetId).getSheets()[0]; // There is the data in 1st tab.
var data = sheet.getDataRange().getValues();
Drive.Files.remove(convertedSpreadsheetId); // Remove the converted file.

//var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet_new = SpreadsheetApp.openById("1jRh8sj_jAaZKH4xbdpI9Q4to1tKuGWTTO2MzHlU").getSheetByName("Data drop");
/*for (var i = 0; i > sheet_new.length; i++) {
  var range = sheet_new[i].getRange("A:I");
     range.clearContents();
}*/
  sheet_new.clearContents();
 var range = sheet_new.getRange(1,1, data.length,data[0].length);
range.setValues(data);

}

Для файлов CSV:

function getCSV() {

var thread = GmailApp.getUserLabelByName("Invoicing").getThreads(0,1);

/* var message = thread[0].getMessages()[0]; // Get first message */
var messages = thread[0].getMessages();
var len = messages.length;
var message=messages[len-1] //get last message
var attachments = message.getAttachments(); // Get attachment of first message

var csv =  attachments[0].getDataAsString();
var data = Utilities.parseCsv(csv);

var a = data.length ;
var b = data[0].length;

//var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.openById("1jRh8sj_jAaZKH4xbdpI9Q4to1tKuGWTTO2MzHlU").getSheetByName("Data drop");
sheet.getRange("A:J").clear();
 var range_final = sheet.getRange(1,1, data.length,data[0].length);
range_final .setValues(data);

}

1 Ответ

1 голос
/ 06 мая 2019

Как насчет этой модификации?В этой модификации mimeType сравнивается, и каждый скрипт запускается.Пожалуйста, подумайте об этом как об одном из нескольких ответов.

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

function myFunction() {
  var thread = GmailApp.getUserLabelByName("Invoicing").getThreads(0,1);
  var messages = thread[0].getMessages();
  var len = messages.length;
  var message = messages[len-1]; //get last message
  var attachments = message.getAttachments(); // Get attachment of first message
  var blob = attachments[0]; // Is supposes that attachments[0] is the blob of xlsx file.
  blob.setContentTypeFromExtension();

  if (blob.getContentType() == MimeType.MICROSOFT_EXCEL) {

    // Process for XLSX
    var convertedSpreadsheetId = Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS}, blob).id;
    var sheet = SpreadsheetApp.openById(convertedSpreadsheetId).getSheets()[0]; // There is the data in 1st tab.
    var data = sheet.getDataRange().getValues();
    Drive.Files.remove(convertedSpreadsheetId); // Remove the converted file.
    var sheet_new = SpreadsheetApp.openById("1jRh8sj_jAaZKH4xbdpI9Q4to1tKuGWTTO2MzHlU").getSheetByName("Data drop");
    sheet_new.clearContents();
    var range = sheet_new.getRange(1,1, data.length,data[0].length);
    range.setValues(data);

  } else if (blob.getContentType() == MimeType.CSV) {

    // Process for CSV
    var csv =  blob.getDataAsString();
    var data = Utilities.parseCsv(csv);
    var a = data.length ;
    var b = data[0].length;
    var sheet = SpreadsheetApp.openById("1jRh8sj_jAaZKH4xbdpI9Q4to1tKuGWTTO2MzHlU").getSheetByName("Data drop");
    sheet.getRange("A:J").clear();
    var range_final = sheet.getRange(1,1, data.length,data[0].length);
    range_final.setValues(data);

  }
}

Примечание:

  • Этот модифицированный скрипт предполагает следующее.
    • Индекс 0 файлов вложений - это файл, который вам нужен.
    • Индекс 0 файлов вложений - это файл XLSX или CSV.
    • Имена файловфайлов XLSX и CSV имеют расширение .xlsx и .csv соответственно.

Ссылка:

  • setContentTypeFromExtension () Если я неправильно понял ваш вопрос, и это был не тот результат, который вы хотите, прошу прощения.
...