[英]How to extract an attachment from an email to a shared drive that is in a google sheets?
目前我有一個谷歌腳本,它在我的 Gmail 上每隔 x 次運行一次,它根據 label 檢索所有附件。我通過谷歌表格中的getFolderByName
輸入 email 地址和文件夾的路徑,但問題是這不是如果文件夾在共享驅動器上,則工作。
我在論壇上看到了不同的主題,所以我知道我需要使用Drive API
所以我想檢索我的文件夾的 id,它在我的谷歌工作表中而不是我的getFolderByName
中。
這是3個功能:
getLibelleConfigs
:從配置表中檢索 LibelleConfig 對象getFolderFromPath
:從其路徑獲取或創建文件夾getOrCreateFolder
:恢復或創建文件夾function getLibelleConfigs() {
let spreadSheet = getOrCreateSpreadSheet(config.configSheetPath, config.configSheetHeader);
let sheet = spreadSheet.getSheets()[0];
let values = sheet.getDataRange().getValues();
if (values.length == 0 || values.length == 1 && values[0].length == 1 && values[0][0] == "") sheet.appendRow(config.configSheetHeader);
return values
.filter((row, i) => {
return i > 0 && row.length > 0 && row[0] != "";
})
.map(row => {
let libelle = row[0].trim();
let folderPath = (row.length>1 && row[1] != "" ? row[1] : `/${row[0]}`);
if (!folderPath.startsWith('/')) folderPath = '/' + folderPath;
folderPath = folderPath.trim();
return {
libelle: libelle,
folderPath: folderPath
}
});
}
function getFolderFromPath(path)
{
let strings = path.split("/");
let currentFolder = DriveApp.getRootFolder();
strings.forEach((string, index) => {
if (string == "") return;
currentFolder = getOrCreateFolder(string, currentFolder);
});
return currentFolder;
}
function getOrCreateFolder(folderName, parentFolder) {
let folders = parentFolder.getFoldersByName(folderName);
//Logger.log("folder : " + folders + ", folderName : " + folderName);
if (folders.hasNext()) {
return folders.next();
}
else {
return parentFolder.createFolder(folderName);
}
}
谷歌表格:
+----------------+-----------+
| LABEL | ID FOLDER |
+----------------+-----------+
| aaaa@gmail.com | xxxxx_1 |
| aaaa@gmail.com | xxxxx_3 |
| bbbb@gmail.com | xxxxx_1 |
| bbbb@gmail.com | xxxxx_2 |
+----------------+-----------+
編輯
function saveAttachmentsFromLibelleConfig(libelleConfig, messageIdHistory)
{
let threads = GmailApp.search(`in:inbox has:attachment label:${libelleConfig.libelle}`);
console.info(`${threads.length} ${threads.length > 1 ? 'threads trouvés' : 'thread trouvé'} pour le libellé '${libelleConfig.libelle}'`);
if (threads.length == 0) return;
let parentFolder = getFolderFromPath(libelleConfig.folderPath);
threads.forEach(thread => {
try
{
thread.getMessages().forEach(message => {
if (messageIdHistory.includes(message.getId())) return;
message.getAttachments().forEach(attachment => {
console.info(`Enregistrement de la pièces jointe '${attachment.getName()}' du mail '${message.getSubject()}' - '${message.getId()}' envoyé par '${message.getFrom()}' ayant le libellé '${libelleConfig.libelle}'`);
parentFolder.createFile(attachment.copyBlob());
appendHistory(message.getId(), libelleConfig.libelle, message.getFrom(), attachment.getName(), libelleConfig.folderPath);
});
message.markRead();
});
thread.moveToArchive();
}
catch (e)
{
console.warn(`Erreur lors du traitement du thread '${thread.getFirstMessageSubject()}' : ${e}`);
}
});
}
我的解決方案:
function movefileToSharedDrive() {
makeCopy("My Drive ID", "To Shared Drive ID");
deleteFiles("My Drive ID");
}
function makeCopy(srcFolderId, dstFolderId) {
var srcFolder = DriveApp.getFolderById(srcFolderId);
var dstFolder = DriveApp.getFolderById(dstFolderId);
var files = srcFolder.getFiles();
while (files.hasNext()) {
var file = files.next();
var f = file.makeCopy(dstFolder);
if (file.getMimeType() == MimeType.GOOGLE_APPS_SCRIPT) {
Drive.Files.update({"parents": [{"id": dstFolderId}]}, f.getId());
}
}
}
function deleteFiles(folderId){
var folder = DriveApp.getFolderById(folderId);
var files = folder.getFiles()
while(files.hasNext()){
files.next().setTrashed(true)
}
}
分為三個步驟:
您可以使用 Advanced Drive Service 的Drive.Files.Insert
直接將文件插入到共享的 Drive 中:
function saveToSharedDrive(sharedDriveId, fileBlob) {
const options ={
supportsAllDrives: true
}
var resource = {
title: fileBlob.getName(),
mimeType: fileBlob.getContentType(),
parents:[{
"id": sharedDriveId
}]
}
Drive.Files.insert(resource, fileBlob, options)
}
其中sharedDriveId
是從您的工作表和fileBlob
中獲取的 ID, GmailAttachment
object 以數組形式給出:
GmailApp.getMessageById("message-id").getAttachments()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.