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

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

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

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

ファイル

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

Gmail

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

Google Apps Script

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

Q&A

1回答

1267閲覧

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

Daiki_Koyama

総合スコア0

Google スプレッドシート

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

ファイル

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

Gmail

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

Google Apps Script

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

0グッド

0クリップ

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2022/09/27 07:32

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

回答1

0

コードを見る限り

GAS

1 var pngs = DriveApp.getFilesByType('xlsx'); 2 while (pngs.hasNext()) { 3 var png = pngs.next(); 4 Logger.log(png.getSize()); 5 }

この部分はGoogleDriveにあるgetFilesByTypeで取得したファイルをループで回してサイズをログ出力しているだけです。
行いたい「添付ファイル」に対しては何もしていません。

また、getFilesByType(mimeType)はリファレンスにもある通り引数には検索するファイルの MIME タイプを指定します。
MIMEタイプとはこちらにあるように
”application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”
といった文字列となります。
GASで使用できるEnumはEnum MimeTypeです。
MimeType.GOOGLE_DOCSと使用されているものです。

どこかからコピペしてきたのでしょうが、それが何を行っているのかを理解しましょう。

本題ですが添付ファイルを扱っている場所で添付ファイルのMIMEタイプを判断する形になります。
添付ファイルのMIMEタイプはGmailAttachmentクラスのgetContentType()で取得できます。
なので

GAS

1 if(attachment.getContentType() === MimeType.MICROSOFT_EXCEL) { 2 // エクセルファイルなので保存 3 }

といった形になります。
提示したEnum MimeTypeを見てもらえば分かりますが、エクセルといっても複数のMIMEタイプがありますので注意してください。

投稿2022/09/27 08:46

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daiki_Koyama

2022/09/27 09:21

ご回答ありがとうございます。 ご提案頂いたコードは、どの場所に入れてあげればよいでしょうか。 GAS初心者で申し訳ありません。。。
YAmaGNZ

2022/09/27 10:34

添付ファイルを保存する前に提示したようにif文で判断する形になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問