Я создал скрипт, который может перенести мое вложение gmail на gdrive, но мне нужно изменить свой скрипт, так как он загружает все вложения gmail, даже если они уже загружены.
Могу ли я узнать, что мне нужно изменить в моем сценарии?
function saveGmailToGdrive(){
const folderId = "GDRIVE"
const searchItem = "label:MONEY"
const threads = GmailApp.search(searchItem,0,100)
threads.forEach((thread) => {
const messages = thread.getMessages()
messages.forEach((message) => {
const attachments = message.getAttachments({
includeInlineImages:false,
includeAttachments:true
})
attachments.forEach((attachment) => {
Drive.Files.insert({
title:attachment.getName(),
mimeType:attachment.getContentType(),
parents:[{id:folderId}]
},
attachment.copyBlob()
)
})
})
})
}
Я надеюсь, что кто-то может мне помочь, спасибо!





В таком случае, как насчет сохранения идентификаторов сообщений о том, что файлы вложений были загружены? Таким образом, после 2-го запуска скрипта файлы вложений только из новых сообщений могут быть загружены путем поиска идентификаторов сообщений.
Прежде чем использовать этот скрипт, создайте новую электронную таблицу и поместите идентификатор электронной таблицы в spreadsheetId.
function saveGmailToGdrive() {
const spreadsheetId = "###"; // Please create new Spreadsheet and put Spreadsheet ID here.
// 1. Retrieve message IDs from Spreadsheet.
const sheet = SpreadsheetApp.openById(spreadsheetId).getSheets()[0];
const lastRow = sheet.getLastRow();
const values = lastRow == 0 ? [] : sheet.getRange(1, 1, lastRow).getValues().map(([a]) => a);
// 2. By checking the message IDs, the attachment files are downloaded.
const folderId = "GDRIVE"; // Please set your folder ID.
const searchItem = "label:MONEY";
const threads = GmailApp.search(searchItem, 0, 100);
const ids = threads.flatMap((thread) => {
const messages = thread.getMessages();
return messages.map((message) => {
const id = message.getId();
if (!values.includes(id)) {
const attachments = message.getAttachments({ includeInlineImages: false, includeAttachments: true });
attachments.forEach((attachment) => {
Drive.Files.insert({ title: attachment.getName(), mimeType: attachment.getContentType(), parents: [{ id: folderId }] }, attachment.copyBlob());
});
}
return [id];
});
});
// 3. Update message IDs on Spreadsheet.
if (ids.length == 0) return;
sheet.clear().getRange(sheet.getLastRow() + 1, 1, ids.length, 1).setValues(ids);
}
Спасибо за вашу модификацию, она работает! могу я узнать, есть ли у нас возможность не использовать электронную таблицу?
@rodskies Спасибо за ответ и тестирование. Я рад, что скрипт работает. Во-первых, я думал использовать свойство script. Но я подумал, что размер свойств скрипта может быть мал для базы данных. Итак, я предложил использовать Spreadsheet в качестве базы данных. Например, в вашей ситуации, как простой метод, я думаю, что текстовый файл также может быть использован в качестве базы данных для хранения идентификаторов сообщений.
Хорошо, спасибо за вашу помощь и вклад. Я многому учусь. ваше здоровье!
Хотя я не уверен, соответствует ли предложенный мной метод тому направлению, которое вы ожидаете, я предложил ответ. Не могли бы вы подтвердить это? Если я неправильно понял ваш вопрос и это было бесполезно, приношу свои извинения.