正在将 Google Doc 脚本更新到 Google 驱动器(将带有标签的电子邮件存档到驱动器)
Updating Google Doc script to Google Drive (Archive emails with tags to drive)
我的脚本将带有特定标签的电子邮件的 pdf 版本保存到 Google 驱动器。对于三个不同的标签,我有三个几乎相同的脚本版本,我会定期 运行 它们。
最近,由于 DocsList 的贬值,他们停止了工作。我将 DocsList 的所有实例都更改为 DriveApp,但现在收到错误 "TypeError: Cannot find function createFolder in object FolderIterator."
问题出在最后几行,脚本应该在其中创建一个用于保存电子邮件 pdf 的文件夹。
有人可以帮我修复 createFolder 函数并恢复脚本并 运行ning 吗?
/**
* Main function run at spreadsheet opening
*/
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [
{name: "Initialize", functionName: "init"},
{name: "Archive Gmail Messages", functionName: "ScanGmail"}
];
ss.addMenu("Gmail Archiver", menuEntries);
}
/**
* Initialize the system
*/
function init() {
// Create the needed Gmail label
GmailApp.createLabel("Archive to Drive");
// Create Google Drive folder if doesn't exists
try {
var folder = DriveApp.getFolder("Email Archive");
} catch(e) {
// Folder doesn't exists
DriveApp.createFolder("Email Archive");
}
Browser.msgBox("Created Gmail label: Archive to Drive and Google Drive folder: Email Archive");
}
/**
* Scan Gmail account for message archive requests
*/
function ScanGmail() {
// Default Drive folder where to archive messages
var baseFolder = "Sparkfly Receipts 2015";
// Get the label
var label = GmailApp.getUserLabelByName("Sparkfly receipt");
var threadsArr = getThreadsForLabel(label);
for(var j=0; j<threadsArr.length; j++) {
var messagesArr = getMessagesforThread(threadsArr[j]);
for(var k=0; k<messagesArr.length; k++) {
var messageId = messagesArr[k].getId();
var messageDate = Utilities.formatDate(messagesArr[k].getDate(), Session.getTimeZone(), "MM.dd.yyyy");
var messageFrom = messagesArr[k].getFrom();
var messageSubject = messagesArr[k].getSubject();
var messageBody = messagesArr[k].getBody();
var messageAttachments = messagesArr[k].getAttachments();
// Create the new folder to contain the message
var newFolderName = messageDate + " - " + messageSubject;
var newFolder = createDriveFolder(baseFolder, newFolderName);
// Create the message PDF inside the new folder
var htmlBodyFile = newFolder.createFile('body.html', messageBody, "text/html");
var pdfBlob = htmlBodyFile.getAs('application/pdf');
pdfBlob.setName(newFolderName + ".pdf");
newFolder.createFile(pdfBlob);
htmlBodyFile.setTrashed(true);
// Save attachments
for(var i = 0; i < messageAttachments.length; i++) {
var attachmentName = messageAttachments[i].getName();
var attachmentContentType = messageAttachments[i].getContentType();
var attachmentBlob = messageAttachments[i].copyBlob();
newFolder.createFile(attachmentBlob);
}
}
// Remove Gmail label from archived thread
label.removeFromThread(threadsArr[j]);
}
Browser.msgBox("Gmail messages successfully archived to Google Drive");
}
/**
* Find all user's Gmail labels that represent mail message
* movement requests es: moveto->xx@yyyy.com
*
* @return {GmailLabel[]} Array of GmailLabel objects
*/
function scanLabels() {
// logs all of the names of your labels
var labels = GmailApp.getUserLabels();
var results = new Array();
for (var i = 0; i < labels.length; i++) {
if(labels[i].getName() == "Sparkfly receipt") {
results.push(labels[i]);
}
}
return results;
}
/**
* Get all Gmail threads for the specified label
*
* @param {GmailLabel} label GmailLabel object to get threads for
* @return {GmailThread[]} an array of threads marked with this label
*/
function getThreadsForLabel(label) {
var threads = label.getThreads();
return threads;
}
/**
* Get all Gmail messages for the specified Gmail thread
*
* @param {GmailThread} thread object to get messages for
* @return {GmailMessage[]} an array of messages contained in the specified thread
*/
function getMessagesforThread(thread) {
var messages = thread.getMessages();
return messages;
}
/**
* Get methods of an object
* @param {Object} object to scan
* @return {Array} object's methods
*/
function getMethods(obj) {
var result = [];
for (var id in obj) {
try {
if (typeof(obj[id]) == "function") {
result.push(id + ": " + obj[id].toString());
}
} catch (err) {
result.push(id + ": inaccessible");
}
}
return result;
}
/**
* Create a Google Drive Folder
*
* @param {String} baseFolder name of the base folder
* @param {String} folderName name of the folder
* @return {Folder} the folder object created representing the new folder
*/
function createDriveFolder(baseFolder, folderName) {
var baseFolderObject = DriveApp.getFoldersByName(baseFolder);
return baseFolderObject.createFolder(folderName);
}
方法 getFoldersByName() returns 一个 FolderIterator(文件夹对象的集合),并且该集合不包含 "createFolder" 方法。
因此,如果集合至少有一个 Folder 对象,您应该将该对象从集合中取出,然后调用 "createFolder"。
您可以在此处找到文档:https://developers.google.com/apps-script/reference/drive/folder#getFoldersByName(String)
我的脚本将带有特定标签的电子邮件的 pdf 版本保存到 Google 驱动器。对于三个不同的标签,我有三个几乎相同的脚本版本,我会定期 运行 它们。
最近,由于 DocsList 的贬值,他们停止了工作。我将 DocsList 的所有实例都更改为 DriveApp,但现在收到错误 "TypeError: Cannot find function createFolder in object FolderIterator."
问题出在最后几行,脚本应该在其中创建一个用于保存电子邮件 pdf 的文件夹。
有人可以帮我修复 createFolder 函数并恢复脚本并 运行ning 吗?
/**
* Main function run at spreadsheet opening
*/
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [
{name: "Initialize", functionName: "init"},
{name: "Archive Gmail Messages", functionName: "ScanGmail"}
];
ss.addMenu("Gmail Archiver", menuEntries);
}
/**
* Initialize the system
*/
function init() {
// Create the needed Gmail label
GmailApp.createLabel("Archive to Drive");
// Create Google Drive folder if doesn't exists
try {
var folder = DriveApp.getFolder("Email Archive");
} catch(e) {
// Folder doesn't exists
DriveApp.createFolder("Email Archive");
}
Browser.msgBox("Created Gmail label: Archive to Drive and Google Drive folder: Email Archive");
}
/**
* Scan Gmail account for message archive requests
*/
function ScanGmail() {
// Default Drive folder where to archive messages
var baseFolder = "Sparkfly Receipts 2015";
// Get the label
var label = GmailApp.getUserLabelByName("Sparkfly receipt");
var threadsArr = getThreadsForLabel(label);
for(var j=0; j<threadsArr.length; j++) {
var messagesArr = getMessagesforThread(threadsArr[j]);
for(var k=0; k<messagesArr.length; k++) {
var messageId = messagesArr[k].getId();
var messageDate = Utilities.formatDate(messagesArr[k].getDate(), Session.getTimeZone(), "MM.dd.yyyy");
var messageFrom = messagesArr[k].getFrom();
var messageSubject = messagesArr[k].getSubject();
var messageBody = messagesArr[k].getBody();
var messageAttachments = messagesArr[k].getAttachments();
// Create the new folder to contain the message
var newFolderName = messageDate + " - " + messageSubject;
var newFolder = createDriveFolder(baseFolder, newFolderName);
// Create the message PDF inside the new folder
var htmlBodyFile = newFolder.createFile('body.html', messageBody, "text/html");
var pdfBlob = htmlBodyFile.getAs('application/pdf');
pdfBlob.setName(newFolderName + ".pdf");
newFolder.createFile(pdfBlob);
htmlBodyFile.setTrashed(true);
// Save attachments
for(var i = 0; i < messageAttachments.length; i++) {
var attachmentName = messageAttachments[i].getName();
var attachmentContentType = messageAttachments[i].getContentType();
var attachmentBlob = messageAttachments[i].copyBlob();
newFolder.createFile(attachmentBlob);
}
}
// Remove Gmail label from archived thread
label.removeFromThread(threadsArr[j]);
}
Browser.msgBox("Gmail messages successfully archived to Google Drive");
}
/**
* Find all user's Gmail labels that represent mail message
* movement requests es: moveto->xx@yyyy.com
*
* @return {GmailLabel[]} Array of GmailLabel objects
*/
function scanLabels() {
// logs all of the names of your labels
var labels = GmailApp.getUserLabels();
var results = new Array();
for (var i = 0; i < labels.length; i++) {
if(labels[i].getName() == "Sparkfly receipt") {
results.push(labels[i]);
}
}
return results;
}
/**
* Get all Gmail threads for the specified label
*
* @param {GmailLabel} label GmailLabel object to get threads for
* @return {GmailThread[]} an array of threads marked with this label
*/
function getThreadsForLabel(label) {
var threads = label.getThreads();
return threads;
}
/**
* Get all Gmail messages for the specified Gmail thread
*
* @param {GmailThread} thread object to get messages for
* @return {GmailMessage[]} an array of messages contained in the specified thread
*/
function getMessagesforThread(thread) {
var messages = thread.getMessages();
return messages;
}
/**
* Get methods of an object
* @param {Object} object to scan
* @return {Array} object's methods
*/
function getMethods(obj) {
var result = [];
for (var id in obj) {
try {
if (typeof(obj[id]) == "function") {
result.push(id + ": " + obj[id].toString());
}
} catch (err) {
result.push(id + ": inaccessible");
}
}
return result;
}
/**
* Create a Google Drive Folder
*
* @param {String} baseFolder name of the base folder
* @param {String} folderName name of the folder
* @return {Folder} the folder object created representing the new folder
*/
function createDriveFolder(baseFolder, folderName) {
var baseFolderObject = DriveApp.getFoldersByName(baseFolder);
return baseFolderObject.createFolder(folderName);
}
方法 getFoldersByName() returns 一个 FolderIterator(文件夹对象的集合),并且该集合不包含 "createFolder" 方法。
因此,如果集合至少有一个 Folder 对象,您应该将该对象从集合中取出,然后调用 "createFolder"。
您可以在此处找到文档:https://developers.google.com/apps-script/reference/drive/folder#getFoldersByName(String)