-
-
Save bkd27/75ab731d58703bef624b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* | |
* Copyright 2012 - Luca Giacomel (lgiacomel [at] google [dot] com) | |
* Use this at your own risk! | |
* Remember that Google has nothing to do with this | |
* Distributed under GPLv3 | |
* | |
*/ | |
function doGet(e) { | |
return HtmlService.createHtmlOutputFromFile('index'); | |
} | |
function doGetMailCount(e){ | |
var label_name = e.parameter.labelName; | |
var limit_extensions = e.parameter.limitExtensions; | |
if (limit_extensions == "true"){ | |
var extensions = " filename:("+e.parameter.extensions.replace(/,/g," OR ")+")"; | |
}else{ | |
var extensions = ""; | |
} | |
var search_query = "has:attachment"+extensions; | |
var count = 0; | |
var tl = GmailApp.search(search_query,0,500).length; | |
while( tl > 0){ | |
count += tl; | |
tl = GmailApp.search(search_query,count,500).length; | |
} | |
Logger.log(count); | |
return count; | |
} | |
function _getLabelledMails(e){ | |
var label_name = e.parameter.labelName; | |
var count = 0; | |
var tl = GmailApp.search("label:"+label_name+"-small OR label:"+label_name+"-medium OR label:"+label_name+"-big",0,500).length; | |
while( tl > 0 ){ | |
count += tl; | |
tl = GmailApp.search(search_query,count,500).length; | |
} | |
Logger.log(count); | |
return count; | |
} | |
function doCheckProgress(e){ | |
try{ | |
return _getLabelledMails(e); | |
}catch(error){ | |
while(error != null){ | |
try{ | |
Utilities.sleep(5000); | |
return _getLabelledMails(e); | |
}catch(error){ | |
Logger.log("Error: "+error); | |
} | |
} | |
} | |
} | |
function _createOrGetFolder(base,folder_name){ | |
try{ | |
var folder = null; | |
var all_folders = base.getFolders(); | |
for (folder_index in all_folders){ | |
if (folder_name == all_folders[folder_index].getName()){ | |
folder = all_folders[folder_index]; | |
} | |
} | |
if (folder == undefined || folder == null){ | |
var folder = base.createFolder(folder_name); | |
} | |
}catch(error){ | |
var folder = base.createFolder(folder_name); | |
} | |
return folder; | |
} | |
function _safe(string){ | |
return string.replace("<","<").replace(">",">").replace("Â",""); | |
} | |
function _writeMailToFile(thread, folder){ | |
messages = thread.getMessages(); | |
o = "<html>"; | |
for (message_index in messages){ | |
m = messages[message_index]; | |
o += "<p><b>"+m.getSubject()+"</b></p>\n"; | |
o += "<p>From: "+_safe(m.getFrom())+" to: "+_safe(m.getTo())+" </p>\n"; | |
o += "<p><i>CC:"+_safe(m.getCc())+" Date: "+m.getDate()+"</i></p>\n"; | |
o += "<div>"+m.getBody()+"</div>\n"; | |
o += "<br/><hr/><br/>\n"; | |
} | |
o += "</html>"; | |
var file = folder.createFile("thread.html", o, "text/html"); | |
return file; | |
} | |
function _getFileSize(file){ | |
/* API max rate limit safe function */ | |
try{ | |
var file_size = file.getBytes().length/1024/1024; | |
var error = null; | |
}catch(e){ | |
while(e != null){ | |
try{ | |
Utilities.sleep(5000); | |
var file_size = file.getBytes().length/1024/1024; | |
var error = null; | |
}catch(e){ | |
Logger.log("Error: "+e); | |
} | |
} | |
} | |
return file_size; | |
} | |
function _getMessages(thread){ | |
/* API max rate limit safe function */ | |
try{ | |
var messages = thread.getMessages(); | |
var error = null; | |
}catch(e){ | |
while(e != null){ | |
try{ | |
Utilities.sleep(1000); | |
var messages = thread.getMessages(); | |
var error = null; | |
}catch(e){ | |
Logger.log("Error: "+e); | |
} | |
} | |
throw "Gimme more time.."; | |
} | |
return messages; | |
} | |
function _getAttachments(message){ | |
/* API max rate limit safe function */ | |
try{ | |
var attachments = message.getAttachments(); | |
var error = null; | |
}catch(e){ | |
while(e != null){ | |
try{ | |
Utilities.sleep(1000); | |
var attachments = message.getAttachments(); | |
var error = null; | |
}catch(e){ | |
Logger.log("Error: "+e); | |
} | |
} | |
} | |
return attachments; | |
} | |
function _moveAttachmentToDrive(folder, attachment, thread, structured_folders, folder_name){ | |
if(structured_folders == "true"){ | |
var sub_folder = _createOrGetFolder(folder, folder_name); | |
var file = sub_folder.createFile(attachment.copyBlob()); | |
_writeMailToFile(thread, sub_folder); | |
}else{ | |
var file = folder.createFile(attachment.copyBlob()); | |
_writeMailToFile(thread, folder); | |
} | |
return true; | |
} | |
function doSync(e) { | |
var start = new Date().getTime() / 1000; | |
var small_threshold = 3; | |
var medium_threshold = 10; | |
var limit_extensions = e.parameter.limitExtensions; | |
var start_from_thread_no = 0; | |
var number_of_threads = 2; | |
var auto_trash = e.parameter.autoTrash; | |
var label_only = e.parameter.labelOnly; | |
if (limit_extensions == "true"){ | |
var extensions = " filename:("+e.parameter.extensions.replace(/,/g," OR ")+")"; | |
}else{ | |
var extensions = ""; | |
} | |
var label_name = e.parameter.labelName; | |
var structured_folders = e.parameter.structuredFolders; | |
var threads = GmailApp.search("has:attachment"+extensions+" -label:"+label_name+"-small -label:"+label_name+"-medium -label:"+label_name+"-big",0,5); | |
Logger.log("has:attachment"+extensions+" -label:"+label_name+"-small -label:"+label_name+"-medium -label:"+label_name+"-big"); | |
if (threads.length==0){ | |
return "finished"; | |
} | |
try{ | |
var small = GmailApp.createLabel(label_name+" small"); | |
var medium = GmailApp.createLabel(label_name+" medium"); | |
var big = GmailApp.createLabel(label_name+" big"); | |
}catch (error){ | |
var small = GmailApp.getUserLabelByName(label_name+" small"); | |
var medium = GmailApp.getUserLabelByName(label_name+" medium"); | |
var big = GmailApp.getUserLabelByName(label_name+" big"); | |
} | |
Logger.log("something"); | |
var folder = _createOrGetFolder(DocsList,"G2D-"+label_name); | |
for (var thread_index in threads) { | |
var label_thread = false; | |
var messages = threads[thread_index].getMessages(); | |
for (var message_index in messages){ | |
var attachments = messages[message_index].getAttachments(); | |
Logger.log("@ "+(new Date().getTime() / 1000-start)+" - "+messages[message_index].getSubject()); | |
if (attachments.length > 0){ | |
Logger.log(attachments.length); | |
for (var attachment_index in attachments){ | |
var attachment = attachments[attachment_index]; | |
var extension = attachment.getName().split('.').pop().toLowerCase(); | |
Logger.log(attachment.getName()); | |
/* double check that this is an attachment which we want to transfer */ | |
//if (e.parameter.extensions.replace(extension,"")!=e.parameter.extensions || limit_extensions == false){ | |
blob = attachment.copyBlob(); | |
var file_size = _getFileSize(attachment); | |
/* Small attachment */ | |
if(file_size < small_threshold){ | |
threads[thread_index].addLabel(small); | |
/* Medium attachment */ | |
}else if(file_size < medium_threshold){ | |
if (auto_trash == "true" && label_only != "true"){ | |
threads[thread_index].moveToTrash(); | |
}else{ | |
threads[thread_index].addLabel(medium); | |
} | |
if(label_only != "true"){ | |
_moveAttachmentToDrive(folder, attachment, threads[thread_index], structured_folders, threads[thread_index].getFirstMessageSubject()); | |
} | |
/* Big attachment */ | |
}else if(file_size >= medium_threshold){ | |
if (auto_trash == "true" && label_only != "true"){ | |
threads[thread_index].moveToTrash(); | |
}else{ | |
threads[thread_index].addLabel(big); | |
} | |
if(label_only != "true"){ | |
_moveAttachmentToDrive(folder, attachment, threads[thread_index], structured_folders, threads[thread_index].getFirstMessageSubject()); | |
} | |
} | |
/* Sleep for a while, to avoid hitting APIs max rate limits */ | |
Utilities.sleep(1000); | |
//} | |
} | |
}else{ | |
threads[thread_index].addLabel(small); | |
} | |
/* Sleep a while, to avoid hitting APIs max rate limits */ | |
Utilities.sleep(1000); | |
} | |
} | |
return threads[0].getLabels().length; | |
//var moved_threads = GmailApp.search("label:"+label_name+"-small OR label:"+label_name+"-medium OR label:"+label_name+"-big"); | |
//return moved_threads.length; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment