【发布时间】:2021-08-28 17:30:36
【问题描述】:
我正在尝试使用 Google Apps 脚本自动将附件从 Gmail 收件箱下载到帐户 Google Drive 上的特定文件夹。我发现下面的代码可以很好地完成该部分,但我还需要它用新文件覆盖同名文件或删除旧文件并上传新文件。此外,当我只需要复制 .xlsx 文件时,它似乎仍在从具有多个附件的电子邮件中下载所有文件类型。任何帮助将非常感激。 (代码归功于 googleappsscript.org)
// GLOBALS
//Array of file extension which you would like to extract to Drive
var fileTypesToExtract = ['jpg', 'tif', 'png', 'gif', 'bmp', 'svg'];
//Name of the folder in google drive i which files will be put
var folderName = 'GmailToDrive';
//Name of the label which will be applied after processing the mail message
var labelName = '@indrive';
function GmailToDrive(){
//build query to search emails
var query = '';
//filename:jpg OR filename:tif OR filename:gif OR fileName:png OR filename:bmp OR filename:svg'; //'after:'+getDateNDaysBack_(1)+
for(var i in fileTypesToExtract){
query += (query === '' ?('filename:'+fileTypesToExtract[i]) : (' OR filename:'+fileTypesToExtract[i]));
}
query = 'in:inbox has:nouserlabels ' + query;
// query += ' after:'+getDateNDaysBack_(1);
var threads = GmailApp.search(query);
var label = getGmailLabel_(labelName);
var parentFolder;
if(threads.length > 0){
parentFolder = getFolder_(folderName);
}
var root = DriveApp.getRootFolder();
for(var i in threads){
var mesgs = threads[i].getMessages();
for(var j in mesgs){
//get attachments
var attachments = mesgs[j].getAttachments();
for(var k in attachments){
var attachment = attachments[k];
// var isDefinedType = checkIfDefinedType_(attachment);
// if(!isDefinedType) continue;
var attachmentBlob = attachment.copyBlob();
var file = DriveApp.createFile(attachmentBlob);
parentFolder.addFile(file);
root.removeFile(file);
}
}
threads[i].addLabel(label);
}
}
//This function will get the parent folder in Google drive
function getFolder_(folderName){
var folder;
var fi = DriveApp.getFoldersByName(folderName);
if(fi.hasNext()){
folder = fi.next();
}
else{
folder = DriveApp.createFolder(folderName);
}
return folder;
}
//getDate n days back
// n must be integer
function getDateNDaysBack_(n){
n = parseInt(n);
var date = new Date();
date.setDate(date.getDate() - n);
return Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy/MM/dd');
}
function getGmailLabel_(name){
var label = GmailApp.getUserLabelByName(name);
if(!label){
label = GmailApp.createLabel(name);
}
return label;
}
//this function will check for filextension type.
// and return boolean
function checkIfDefinedType_(attachment){
var fileName = attachment.getName();
var temp = fileName.split('.');
var fileExtension = temp[temp.length-1].toLowerCase();
if(fileTypesToExtract.indexOf(fileExtension) !== -1) return true;
else return false;
}
【问题讨论】:
-
我只是想澄清一下,您只想下载/复制电子邮件中附加的 .xslx 文件?并将其上传到驱动器中的特定文件夹中(删除现有的类似文件名并将其替换为新文件)?这是正确的吗?
-
您现在拥有的代码执行了一个 createFile,它每次都会创建一个新文件。您应该做的是搜索与您正在下载的文件同名的文件,然后执行更新文件。
-
@RonM 是的,只有 .xlsx 文件,是的,我想将它们上传到特定文件夹并替换具有相同文件名的文件。
标签: google-apps-script google-drive-api gmail gmail-api