Hi there,
I seem to be having an issue where the Mime Type GOOGLE_SHEETS is not recognised. I've had the exact same script work on one account but not another so I think that maybe there is a permissions error or something? I have the drive api v2 enabled in the advanced google services setting so it shouldn't be that.
The exact error is ths: API call to drive.files.insert failed with error: Invalid mime type provided (line 86, file "Code")
The code I'm using is included below. Any help is very appreciated, thank you!
Finn
var SPREADSHEET_ID = 'SPREADSHEET_ID';
/* ------------- no changes below needed ------------- */
var spreadSheet = SpreadsheetApp.openById(SPREADSHEET_ID);
var GMAIL_LABEL = 'LABEL';
var SPREADSHEET_NAME = 'SPREADSHEET_NAME';
var sheet = spreadSheet.getSheetByName(SPREADSHEET_NAME);
/**
* Get all the starred threads within our label and process their attachments
*/
function main() {
var labels = getSubLabels(GMAIL_LABEL);
for (var i = 0; i < labels.length; i++) {
var threads = getUnprocessedThreads(labels[i]);
for(var j = 0; j < threads.length; j++) {
processThread(threads[j], labels[i]);
}
}
}
/**
* Get all the given label and all its sub labels
*
* @param {string} name
* @return {GmailLabel[]}
*/
function getSubLabels(name) {
var labels = GmailApp.getUserLabels();
var matches = [];
for(var i = 0; i < labels.length; i++){
var label = labels[i];
if (label.getName() === name || label.getName().substr(0, name.length+1) === name + '/') {
matches.push(label);
}
}
return matches;
}
/**
* Get all starred threads in the given label
*
* @param {GmailLabel} label
* @return {GmailThread[]}
*/
function getUnprocessedThreads(label) {
var from = 0;
var perrun = 50; //maximum is 500
var threads;
var result = [];
do {
threads = label.getThreads(from, perrun);
from += perrun;
for(var i = 0; i < threads.length; i++) {
if(!threads[i].hasStarredMessages()) continue;
result.push(threads[i]);
}
} while (threads.length === perrun);
Logger.log(result.length + ' threads to process in ' + label.getName());
return result;
}
/**
* @param {GmailThread} thread
* @param {GmailLabel} label where this thread was found
*/
function processThread(thread, label) {
var messages = thread.getMessages();
for(var j = 0; j < messages.length; j++) {
var message = messages[j];
if(!message.isStarred()) continue;
Logger.log('processing message from '+message.getDate());
var attachments = message.getAttachments();
for(var i = 0; i < attachments.length; i++) {
var xlsxBlob = attachments[i]; // Is supposes that attachments[i] 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.
writeToGoogleSheet(data);
}
message.unstar();
}
}
/**
* Get the extension of a file
*
* @param {string} name
* @return {string}
*/
function getExtension(name) {
var re = /(?:\.([^.]+))?$/;
var result = re.exec(name);
if(result && result[1]) {
return result[1].toLowerCase();
} else {
return 'unknown';
}
}
/*
* Write results to Google Sheet
*
* @param {Array<Array>} csvData 2D array to be printed to the Google Sheet
*/
function writeToGoogleSheet(csvData) {
sheet.clearContents().clearFormats();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}