質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

受付中

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

Daiki_Koyama
DK1111

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

1回答

0リアクション

0クリップ

244閲覧

投稿2022/09/27 07:23

編集2022/09/27 08:23

前提

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/ツールのバージョンなど)

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

YAmaGNZ

2022/09/27 07:32

ソースコードは見やすくコードの挿入ボタンを押して「コード」部分にソースコードを記載してください。 >getMimeType() でエクセル形式を指定しましたが、うまく動きませんでした。 どう試してどうなったのでしょうか?

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。