飽き性の頭の中

Gmailの添付ファイルを自動的にGoogle Driveに保存する方法|Google Apps Script(GAS)

2023-04-30に公開

IT技術メモ
# Gmail# Google Drive# Google Apps Script# GAS

Gmail のメーリスで時折添付されてくる重要なファイルを忘れずに保存したいけど、いちいちメールから適切なフォルダに保存するのがめんどくさいので、自動で Google Drive に保存するようにしたい、というモチベーションはあるだろう。

Google Apps Script(通常、GAS)でできるらしいのでやってみた。

やろうとしたこと

  1. Gmail の特定の検索条件に該当するメールの一覧を取得
  2. 指定した Google Drive のフォルダを参照
  3. 該当フォルダに既に同名のファイルがあるかどうかを確認
  4. 同名ファイルがない場合のみ、メールに添付されているファイルを Google Drive に保存

いくつか先行記事があったので参考にしたが、最新の一日分のみを保存対象とするようにするなどの方法で重複排除をしていた。

しかし、初回は最新の一日分のみならず全件対象にしたいなどいろいろ条件があると思うので、ファイル名で重複を判定するようにした。

こうすることで、どれくらいの頻度で実行しても、重複したファイルは保存されないようになる。

ただし内容の違う同名ファイルは重複とみなされ保存されないので、その可能性だけには留意が必要である。厳密に行こうとするならば、ハッシュ値を取得して比較するなどの処理が必要になるだろう。

あとは、ファイルを見たくなるようなメールはいつも星をつけていたのでその処理を入れているが、扶養な方は既読にするなり、ラベルをつけるなり、好きなようにカスタマイズするとよいだろう。

実際のコード

function main() {
// 検索条件を設定
const searchConditions = [
"has:attachment", // 添付ファイルがある
"to:your_group_email@example.com" // 特定の宛先に送られた
];
const searchQuery = searchConditions.join(" ");
const searchResults = GmailApp.search(searchQuery);
const messages = GmailApp.getMessagesForThreads(searchResults);
// メールを処理
for (const threadMessages of messages) {
for (const message of threadMessages) {
const attachments = message.getAttachments();
saveAttachmentsToDrive(attachments);
}
// スターを付ける
threadMessages[0].star();
}
}
function saveAttachmentsToDrive(attachments) {
// Googleドライブのフォルダを指定
const storageFolder = DriveApp.getFolderById("your_folder_id");
// 添付ファイルを保存
for (const attachment of attachments) {
const filename = attachment.getName();
let existingFile = null;
const filesIterator = storageFolder.getFilesByName(filename);
// ファイルが既に存在するかチェック
if (filesIterator.hasNext()) {
existingFile = filesIterator.next();
}
// ファイルが存在しない場合のみ保存
if (!existingFile) {
storageFolder.createFile(attachment).setName(filename);
}
}
}

使い方

GAS の使い方自体は他の記事を参照するとよいであろう。

Profile picture

たわ / tawachan

1994年生まれ(29歳)

大学院修士課程(政治学)(2021-2023)

Web開発(2017-)

関連記事

タグ一覧

# 福岡:39# 東京:20# 大学院:13# 移住:10# エナジードリンク:9# Google:8# ブロックチェーン:8# Mac:7# Webエンジニア:7# Apple:6# Firebase:6# Next.js:6# Sony:6# サントリー:6# Googleフォト:5# インドネシア:5# 埼玉:5# 英語:5# AWS:4# Canon:4# EOS 8000D:4# Kindle:4# TypeScript:4# ZONe:4# ラーメン:4# 京都:4# 仮想通貨:4# 社会人:4# 鴨川シーワールド:4# Docker:3# EOS8000D:3# Google Drive:3# Lightroom:3# Markdown:3# Pixel:3# React:3# React Native:3# a7iii:3# d.school:3# iPad:3# iPad mini:3# アマルティア・セン:3# アメリカ:3# コワーキングスペース:3# セブンイレブン:3# デザイン思考:3# レッドブル:3# ワークショップ:3# 卒業旅行:3# 寿司:3# 紅葉:3# 長崎:3# API:2# ChatGPT:2# ECR:2# ERC20:2# Expo.io:2# Firestore:2# GPT4:2# Gatsby.js:2# GitHub Actions:2# Kindle Oasis:2# Kindle Paperwhite:2# LINE:2# MacBook Pro:2# NestJS:2# Notion:2# Oculus:2# Oculus Quest:2# Pixel Buds:2# VS Code:2# Zotero:2# iPhone:2# pandoc:2# re:Invent:2# かき小屋:2# カフェ:2# ギグワーカー:2# サーチコンソール:2# ジャカルタ:2# スターバックス:2# ステーキ:2# スマートウォッチ:2# ソラマチ:2# チョコレート:2# ニューヨーク:2# バリ島:2# パンとエスプレッソと:2# ヒュッゲ:2# ビーチ:2# ブックスタンド:2# ブログ:2# マクドナルド:2# ミズマチ:2# モンスターエナジー:2# ワイヤレスイヤホン:2# 三千院:2# 両国:2# 修士論文:2# 兵庫:2# 千葉:2# 博多:2# 堀江貴文:2# 宮崎:2# 就活:2# 嵐山:2# 川越:2# 広島:2# 新宿御苑:2# 旅行:2# 日米学生会議:2# 有馬温泉:2# 東寺:2# 東浩紀:2# 機械学習:2# 歴史:2# 民主主義:2# 江ノ島:2# 清澄白河:2# 独自ドメイン:2# 神奈川:2# 神戸:2# 転職:2

©2023 tawachan All Rights Reserved.