前提
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" }] }); } // Use MimeType enum to log the name of every Google Doc in the user's Drive. var docs = DriveApp.getFilesByType(MimeType.GOOGLE_DOCS); while (docs.hasNext()) { var doc = docs.next(); Logger.log(doc.getName()) } // Use plain string to log the size of every PNG in the user's Drive. var pngs = DriveApp.getFilesByType('xlsx'); while (pngs.hasNext()) { var png = pngs.next(); Logger.log(png.getSize()); } 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/ツールのバージョンなど)
