簡體   English   中英

如何將附件從 email 提取到 google 表格中的共享驅動器?

[英]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)
  }
}

分為三個步驟:

  1. 將附件提取到我的驅動器的觸發器
  2. 然后 function makeCopy 到共享驅動器
  3. 最后一個從我的驅動器中刪除文件(以避免重復)

您可以使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM