[GAS] Gmail 添付ファイルを自動保存したい

前提

Gmailの添付ファイルを自動保存するGASがあるのですが、ファイル形式すべてを保存するのではなく、エクセル形式のみ指定して保存がしたいです。
どこに、どのようなコードでしてしてあげればよいか教えてください。

実現したいこと

特定のメールアドレスで受信したメール内にエクセル形式の添付ファイルがあれば自動保存する

発生している問題・エラーメッセージ

特になし

該当のソースコード

const setMenu = ({
name = "メニュー",
items
}) => {
const ui = SpreadsheetApp.getUi();
const menu = ui.createMenu(name);

for (const menuItem of items) {
menu.addItem(menuItem.name, menuItem.funcName);
}

menu.addToUi();
};

const ss = SpreadsheetApp.getActiveSpreadsheet();

const getSheet = sheetName => {
const sheet = ss.getSheetByName(sheetName);

if (!sheet) {
throw new Error("シートが見つかりませんでした");
}

return sheet;
};

const getRange = params => {
const sheet = getSheet(params.sheetName);

if (params.a1Notation) {
return sheet.getRange(params.a1Notation);
} else if (typeof params.row === "number") {
return sheet.getRange(params.row, params.column || 1, params.numRow || 1, params.numColumn || 1);
}

throw new Error("a1Notationもしくはrowを指定してください");
};

const getValues = ({
excludeEmpty = false,
...params
}) => {
const range = getRange(params);
const values = range.getValues();

if (excludeEmpty) {
return values.filter(row => row.join("") != "");
}

return values;
};
const setValues = params => {
const range = getRange(params);
range.setValues(params.values);
};
const getLastRow = sheetName => {
const sheet = getSheet(sheetName);
return sheet.getLastRow();
};

const queryMessages = ({
query,
page = 1,
perPage = 10
}) => {
const threads = GmailApp.search(query, (page - 1) * perPage, perPage);
return threads.flatMap(thread => thread.getMessages());
};

class Logger {
error(message, payload = {}) {
console.error({ ...payload,
message
});
}

warn(message, payload = {}) {
console.warn({ ...payload,
message
});
}

info(message, payload = {}) {
console.info({ ...payload,
message
});
}

debug(message, payload = {}) {
console.log({ ...payload,
message
});
}

invalidArg(argumentName) {
console.error(Invalid arg: %s, argumentName);
}

invalidArgValue(argumentName, argumentValue) {
console.error(Invalid value for argument: %s: %s, argumentName, argumentValue);
}

missingArg(argumentName) {
console.error(Missing arg: %s, argumentName);
}

}

const logger = new Logger();

const handleError = err => {
logger.error(err.message, {
appName: "save-mail-attachments-to-drive",
error: {
name: err.name,
message: err.message,
stack: err.stack,
cause: err.cause
}
});
};

function onOpen() {
setMenu({
items: [{
name: "添付を取得",
funcName: "handler"
}]
});
}

function getSettings() {
const values = getValues({
sheetName: "設定",
a1Notation: "B1:B2",
excludeEmpty: true
}).flat();
return {
query: values[0],
driveFolder: values[1]
};
}
function getExistingMessageIds() {
return getValues({
sheetName: "保存記録",
a1Notation: "A1:A",
excludeEmpty: true
}).reduce((pv, cv) => ({ ...pv,
[cv[0]]: true
}), {});
}

function handler() {
try {
const settings = getSettings();
const it = DriveApp.getFoldersByName(settings.driveFolder);
let folder;

while (it.hasNext()) { folder = it.next(); } if (!folder) { throw new Error("フォルダが見つかりませんでした"); } const messages = queryMessages({ query: settings.query, page: 1, perPage: 10 }); const messageIds = getExistingMessageIds(); for (const message of messages) { if (messageIds[message.getId()]) { continue; } for (const attachment of message.getAttachments()) { const file = DriveApp.createFile(attachment.copyBlob()); file.moveTo(folder); } setValues({ sheetName: "保存記録", row: getLastRow("保存記録") + 1, values: [[message.getId()]] }); }

} catch (err) {
handleError(err);
}
}

試したこと

getMimeType() でエクセル形式を指定しましたが、うまく動きませんでした。

補足情報(FW/ツールのバージョンなど)

コメントを投稿

0 コメント