Skip to content

Instantly share code, notes, and snippets.

@bkd27
Forked from labnol/Gmail-Archive.js
Created July 9, 2014 08:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bkd27/75ab731d58703bef624b to your computer and use it in GitHub Desktop.
Save bkd27/75ab731d58703bef624b to your computer and use it in GitHub Desktop.
/*
*
* 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("<","&lt;").replace(">","&gt;").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