Gmailのメール整理:数万件のメールを整理するまでの長い長い長い道のり
一日延ばしは時の盗人である(上田敏)
私のGmailの未読件数を見て、同僚には「今まで見たことない」と笑われました。
その屈辱?の経験から数年経ちました。
そして現在 【2023年 令和5年】
ようやく重い腰を上げてメールの整理作業をする事にしました。
1番古いメールが確か2011年でしたから、10年以上も放置してきた事になります。
メールを未読・削除せずに放置し続けた期間も長い
文章も長い
整理に掛かった時間も長い。
プログラムも長い。
記事を纏める時間が長い
・この記事だけに集中してからでも数週間掛かりました
色々長くなりましたので、 「長い長い長い」といつもより「長い」を一つ多くつけました。
ちなみに整理後のメール一覧です。
なんということでしょう。
あの5万件近くあった受信トレイのメールが10件以下に・・。
目次
メールを整理する作業手順
Gmailの整理手順を簡潔にまとめると次の通りです。
1. メールの削除
2. メールをアーカイブして、ラベル付け
3. 復旧処理
「検索オプション」からメールを検索したときに、その適用(検索)条件からのメールが増える可能性がある時は、「フィルタ」を作成します。
今後メールが増えない場合は、フィルタは作らず、メールを選択して「削除」または「アーカイブ(受信トレイをスキップ)してラベル付け」を行います。
検索とフィルタ
復旧処理
1,2のメールの整理の作業完了後に、3の復旧処理を行います。
復旧処理では、「ゴミ箱」と「ラベル」を確認してメールの整理のルールの見直しを行います。
メールの整理作業は、復旧処理で整理したメールを見直しますので、ザックリでも大丈夫です。
メールの整理作業(1、2)の作業が長引くと、確認するメールの量が多くなるため見落とす可能性も高くなります。整理作業は、数日以内に完了させることが理想です。
私のように、作業が数週間に渡った場合は、確認するメールが増えるため、見落としが増える可能性があるため注意が必要です。
その場合でも、メールの整理作業を一回で終わらせず継続してメールを見直すことで徐々にメールの整理と管理のルールが完成に近づいていくと思います。
まとめ
メールの整理は一度だけでなく、継続的な作業として取り組みます。
「ゴミ箱」や「迷惑メール」を確認し、重要なメールが含まれていないかを確認します。
フィルタ(適用条件・フィルタの動作)の見直しを行います。
フィルタの見直しやゴミ箱の確認作業を定期的に繰り返すことによって、メールが正しくラベル付けされる可能性が高まります。
受信トレイに新たなメールが届いた場合も、適切にフィルタリングが行われるように設定を調整します。
メールの整理や管理方法に変更があった場合は、フィルタを適宜更新して反映させます。
フィルタを活用することで、受信トレイのメールを効率的に整理し、必要なメールを迅速に見つけることができるようになります。定期的なフィルタの見直しは、メールの管理をよりスムーズに行うために欠かせないステップです。適切なフィルタ設定を行い、メールの整理作業を効果的にサポートしましょう。
参考: Gmailの削除について
Gmailでは、一定期間内(30日以内)であれば削除したメールもゴミ箱から復元することができます。
メールを削除する際には、メールの整理完了後にゴミ箱を確認してルールを見直すことも重要です。今後同様のメールが届く可能性がある場合や、誤って重要なメールを削除してしまった場合は、ルールを見直します。
余談: 作業のコツ(メールの検索結果について)
メールの整理・管理において大切なのは、順番に進めるのではなく、検索結果を参考にして適切な方針を決めることです。具体的な整理・管理方針を考える際には、次の手順を参考にしてみて下さい。
検索結果をもとにフィルタを作成・更新する:
特定の条件に基づいて自動的にメールを分類し、適切な場所に整理します。
フィルタを正しく設定することで、メールの整理が自動化され、効率的に作業できます。
メールを削除する:
閲覧する予定のないメールや不要なメールを削除して、受信トレイを整理します。
メールの削除によって、必要な情報に素早くアクセスできるようになります。
メールにラベルを付けて受信トレイをスキップする:
メールを受信トレイから移動(アーカイブ)させる際に、適切なラベルを付けます。
ラベルを活用することで、メールをグループ分けして整理し、必要なメールを簡単に見つけられます。
メールの整理は、検索が中心になります。さまざまな検索方法を知っておくと、作業をよりスムーズに進めることができます。
1. メールを削除して整理します
メールを削除する際には、対象となるメールの中で削除件数の多いメールから優先して受信トレイから削除します。
具体的な「メールを削除する」作業の順番としては、次の通りです。
カテゴリのメールをフィルタを作成して削除
条件に一致するメールをフィルタを作成して削除(※ 今後同じ検索(適用)条件のメールが送られてくる場合)
検索条件から 「メール」を全選択して削除
1.1 カテゴリのメールを削除
カテゴリの 「ソーシャル」「フォーラム」「プロモーション」のメールを 「フィルタ」を作成して削除します。
1.2 フィルタを作成・更新して削除
カテゴリ以外で「メールの削除」最低限の作業 メーリングリストの登録解除したかが不明など
検索条件に一致するフィルタを作成してメールを削除します。
1.3 メールを検索して削除
「検索バー」または「検索オプション」に検索条件を指定します。検索結果を選択して 「メール」を削除します。
2. 受信トレイのメールを「ラベル」を付けてスキップします
メールを受信トレイからスキップ(アーカイブ)する際には、ラベルを付けて整理します。
アーカイブしたメールは「すべてのメール」で確認出来ます。
メールをアーカイブすると、受信トレイからメールは消えます。
しかし、そのままでは、「受信トレイ」から「すべてのメール」に移動しただけになり「どういう内容のメールか」が分からなくなります。
そのために、受信トレイから移動する際には、ラベルを必ず付けています。
ラベルを付けることで、必要なメールを見つけ出す手掛かりになります。
受信トレイにあるメールをスキップして整理する方法は、次の2通りを使います。
2.1 「フィルタ」を使用して整理
フィルタを活用することで、受信トレイのメールを効率的に整理し、必要なメールを迅速に見つけることができます。
適用条件は異なるが「同じラベル」に振り分け可能なメールがあった時は、「フィルタ」を更新して 同じフィルタルールを適用出来ないかを検討します。
フィルタルール(フィルタの動作)を設定する際には、「受信トレイをスキップ」するオプションにチェックを入れます。これは、メールの整理作業中に新たなメールが受信トレイに追加されないようにするためです。
現時点の受信トレイに存在するメールの整理に集中できるようにするための工夫です。
フィルタルールの設定
フィルタルール(フィルタの動作)の設定は、次のようにします。
フィルタの見直し:メールの整理後作業
整理作業が完了した後には、フィルタ(適用条件・フィルタの動作)を見直すことも重要です。この見直し作業は、メール整理作業が完了した「復旧処理」の中で行います。
フィルタを見直す際には、次の点に注意をして作業を行います
メールがフィルタによって 誤ったラベルが付いていないかを確認します。
フィルタに含まれるメールを確認し(引き続き) 受信トレイをスキップ(アーカイブ)するかを検討します
受信トレイに残るはずのメールがゴミ箱に振り分けられていないか確認します。
フィルタの見直し作業は、「メールの整理作業完了後」だけでなく 定期的に作業を行うことがお勧めです。
適切なメールが正しくラベル付けされ、望ましくないメールがフィルタリングされる可能性が高くなります。
2.2 「検索」して整理
メールを検索して、検索結果を全選択して、ラベルを付けて、受信トレイをスキップ(アーカイブ)します。
3. プログラムを実行してメールを整理
プログラムでは3工程に分けて作業を行います。
3.1 front.gsの 「emailCountAndSearchCondition」関数を実行
front.gsの 「emailCountAndSearchCondition」関数を実行して、差出人とその差出人からのメールの件数、検索条件を出力します。
検索条件は、「フィルタ」の「検索条件」の足場(候補)として使います。
3.2 フィルタの調整・更新
front.gsの 「createFitlerAndApply」関数を実行するための データを作ります。フィルタの検索条件を決定(整理)し、どのラベルに保存するかを決めて、シートを更新します。
3.3 front.gsの 「createFitlerAndApply」関数を実行
front.gsの 「createFitlerAndApply」関数を実行して、3.2で更新(作成)したデータを基にフィルタを作成します。
スレッド(受信済みのメール)にも 「フィルタ」を適用します。
4. 復旧処理: ルールの見直しなど
メールの整理完了後に「復旧処理」を行い、受信トレイに新たなメールが含まれるようにします。
復旧処理の概要は次の通りです。
フィルタを削除(復旧処理)
・適用条件で「カテゴリ」を指定したフィルタの削除
・検索(適用)条件 で「カテゴリ」以外を指定しているフィルタの見直し・削除
=> ゴミ箱のメール一覧を確認し、フィルタを削除するか「フィルタ」を更新して残すかを決定フィルタを更新
・フィルタの動作で「受信トレイをスキップ」を設定したフィルタの見直しと更新
=> メールを受信トレイに残すか引き続きスキップするかを決定
・ラベルのメールを確認し、誤ってラベル付けをされていた時は、フィルタの動作のラベルを修正。個別対応(メールを検索して選択)
メールの整理作業の時に、「メールを選択」して、メールの「ラベル付け」や 「削除」を実行した場合は、
・検索条件に一致するメールを(全)選択して、ラベルを「移動」して更新
・ 「ゴミ箱」の中で、検索条件に一致するメールを(全)選択して、ラベルを「移動」して復元
・ フィルタで対応した方が良いか検討新たな受信トレイのメールに対してもルールを検討。
次から具体的な手順に入ります。
1. メールを削除します
1.1 カテゴリのメールを削除
カテゴリの「ソーシャル」を例にします。メールの削除の手順は次の通りです。
1.ナビゲーションペインの カテゴリの「ソーシャル」をクリックする
2.「検索オプション」をクリックします
3.「検索オプション」画面の 検索項目 「含む」に 「 category:social」(カテゴリ:ソーシャル) を入力します。
4.「フィルタを作成する」をクリックして、「フィルタルール」(フィルタの動作)を次のように設定します
5.「フィルタを作成」ボタンをクリックします。
6.カテゴリ「ソーシャル」に含まれるメールにルールが適用され削除されていることを確認します
同様の作業を「カテゴリ:プロモーション」、「カテゴリ:フォーラム」でも行います。
参考 カテゴリの検索オプションでの指定方法
検索オプションの「検索」のプルダウンからカテゴリを選択します。
1.2 フィルタを作成・更新して削除
メールが今後送られてくる可能性があるが、閲覧しない可能性が高いメールについては、(一旦)削除します。
1.検索オプションで 「検索条件」を指定します。
2.「フィルタを作成」ボタンをクリックし、フィルタの動作を決定します。
3.「フィルタルール」(フィルタの動作)の次の項目にチェックを付けます
4.「フィルタを作成」 ボタンをクリックします。
1.3 メールを検索して削除
検索条件に一致するメールを全て削除します。
適用(検索)条件のメールが、今後は増えない(可能性が高い)場合は、フィルタルールを追加せずメールを検索をして削除を行います。
1. 検索バーまたは検索オプションで 「検索条件」を指定します。
2 ヘッダーメニューの チェックボックスにチェックを付けます
3.検索結果がページをまたぐ時は、「この検索条件に一致するすべてのスレッドを選択」をクリックし、全てのページのメールを選択します。
4.「削除」(ゴミ箱)アイコンをクリックします
5.「一括操作の確認」ダイアログの 「OK」をクリックします
2. 「受信トレイ」のメールを 「ラベル」を付けてスキップします
「受信トレイ」のメールを 「ラベル」を付けてスキップする方法としては、「フィルタを作成する」と「メールを検索する」の2通りの方法を使います。
「フィルタを作成する」場合は、フィルタの「検索(適用)条件」からのメールが今後も送られてくる可能性がある時です。
今後、その適用(検索)条件から送られて来ない可能性が高い場合は「メールを検索する」を使用します。「検索条件」でヒットしたメールを(全)選択して、「ラベル」を付けて、アーカイブします。
2.1 メールのフィルタを作成する場合
「検索バー」または「検索オプション」からメールを検索して、「フィルターを作成」するか「メールを選択して適用」するかを決めます。
フィルタの動作で「同じラベル」が付くときは、「適用(検索)条件」を一つにまとめてフィルタを更新して対応出来ないか検討します。
フィルタ作成または更新するときのフィルタルール(フィルタ)は次のように設定します
フィルタルール(フィルタの動作)の設定
① フィルタの作成
受信トレイにある 検索条件に一致する任意のメールを選択して「フィルタ」を作成します。
1. 目的のメールの横にあるチェックボックスを選択します。
2. 「その他」アイコン をクリックします。
3.「メールの自動振り分け設定」 をクリックします。
4. 検索バー または検索オプションで フィルタの「適用条件」を設定して、「フィルタを作成」ボタンをクリックします。
5. フィルタ条件(フィルタの動作)を設定します。
6.「フィルタを作成」 ボタンをクリックします。
② フィルタを更新
「フィルタの動作」(フィルタルール)で「同じラベル」に振り分けられる時は、「OR」条件 や グループ化する「()」 などを使用して、フィルタを纏めることを検討します。
1. 右上にある 歯車(設定)アイコン をクリックします。
2.「すべての設定を表示」ボタンをクリックします。
3. 「フィルタとブロック中のアドレス」タブ をクリックします。
4. 更新するフィルタを見つけ「編集」 をクリックします。
5. 検索バー または検索オプションで フィルタの「適用条件」を設定して、「続行」ボタンをクリックします。
6. フィルタルール(フィルタの動作)を設定します。
7. 「フィルタを更新」ボタン をクリックします。
2.2 メールを検索する場合
検索条件に一致するメールを「全選択」して、メールにラベルを付けてから、メールをアーカイブ(受信トレイからスキップ)します。
手順は次の通りです。
1. 検索オプションを表示し、検索条件を指定します
2. 検索条件に一致する「メール」を全選択します。
3. ラベルアイコンをクリックします。
4. 「ラベルを付ける」ウィンドウを表示し、ラベルを選択あるいは 「新規作成」からラベルを追加して、メールに「ラベル」を追加します。
5. 「適用」ボタンをクリックします。
新しいラベルを作成する場合
6. アーカイブアイコンをクリックし、メールをアーカイブします。
3. プログラムを実行してフィルタを作成します。
ある程度受信トレイの整理が進んだら(※)、プログラムから「フィルタ」を作成します。
今回のメールの整理では、プログラムの実行結果は、スプレッドシートに出力します。
プログラムでは 「適用条件」と 「ラベル」を元に フィルタを作成して、受信済みのメールにも同じ「フィルタ」の条件を適用させます。
フィルタの動作
プログラムから作成したフィルタの 「フィルタの動作」は次のようになります
1. 「emailCountAndSearchCondition」関数を実行します
「emailCountAndSearchCondition」関数を実行 すると、「差出人とメール件数」、「検索条件」、検索条件をコピーした「検索条件のコピー」の3つのシートが作成されます。
「検索条件のコピー」シートは、フィルタを作成するための データとして使います。
シート1:差出人とメール件数
差出人のメールアドレスからのメールの件数を、「件数の降順」(多 →少)でソートしてシートの1枚目(差出人とメール件数)に出力します。
シート2:検索条件
「差出人とメール件数」シートを参照して 差出人のメールアドレスと 「メールの検索条件」をシートの2枚目(検索条件)に出力します。
シート3:検索条件 のコピー
「シート2:検索条件」シートをコピーします。「フィルタ」を作成する土台となるシートです。
emailCountAndSearchCondition関数
query:「検索条件」を 変更することが出来ます。コメントアウトしてますが、例えば受信トレイに存在する2年以上前のメールなどが検索出来ます。
// 受信トレイの差出人のメールアドレス、名前、件数を出力する
function emailCountAndSearchCondition() {
// const currentTime = new Date(); // 現在日時
// const twoYearsAgo = new Date(currentTime.getFullYear() - 2, currentTime.getMonth(), currentTime.getDate());
// 検索条件を指定する
/** 受信トレイのメールを検索する */
const query = "is:inbox";
/** 受信トレイにある2年以上前のメールを検索する */
// const query = "is:inbox before:" + formatDate_(twoYearsAgo);
FirstSheet.display(query)
SecondSheet.display();
}
2. 「シート3:検索条件 のコピー」シートの更新とメールの整理
シートの更新
「シート3:検索条件 のコピー」シートを編集します。シートの内容を参考にしながら、「C列」の「検索条件の修正」、「D列」に 受信トレイからの移動先のラベルを記入します。
「メールの整理」の対象から外す場合は、行を削除して対応します。条件を後で使う可能性があるなどでシートに残したい場合などは「E列」のフラグを「2」に設定します。
フィルターは作成したくないが、送受信済みのメールには、「フィルタの振り分けルール」を適用したい場合は、フラグを「0」に設定します。
メールの整理
「C列」の検索条件を基に、「メールを検索」して
の作業を繰り返し行います。
「シートの更新」と 「メールの整理」の作業を繰り返して、シートのルールを纏めます。
3. 「createFitlerAndApply」関数を実行します
「createFitlerAndApply」関数を実行すると、 選択しているシート(シート3:検索条件 のコピー)を対象にして処理を実行します。
対象のシートのC列の「メールの検索条件」を D列の「ラベル」に振り分けるフィルタを新規に作成します。E列は、「フィルタを作成」するかしないかのフラグです。
E列:フラグ
フラグは「0」「1」「2」(半角数字)を指定出来ます。
0: フィルタはさ作成しないが、 「スレッドにフィルタのルールを適用」する
1: フィルタはさ作成する。 「スレッドにフィルタのルールを適用」する
2: 何も処理を行わない。(行をスキップ)
次に載せた参考のソースコードからも分かるように、C列からE列までを処理し、A列とB列は使用しません。
その理由としては、「emailCountAndSearchCondition」で作成された、検索条件 のコピーシートを編集して使用する事を想定しているからです。
例として、C列 「label:sent-messages subject:test」 D列「テスト」E列「1」と入力して、シートを選択した状態で「createFitlerAndApply」関数を実行します。
実行前には「テスト」ラベルが付いていないこと
「createFitlerAndApply」関数を実行後に、フィルタが作成されている事
フィルタルール(フィルタの動作)として、次の項目にチェックがついていること
検索バーに「label:sent-messages subject:test」を入力して再検索すると「テスト」ラベルが付いてる事を確認します。
UI(画面)上から 「ラベル」を含める検索条件でフィルターを作成しようとすると、「受信(する)メールに一致しない」という警告(※)が出ますが、今回は例なので無視しています。(※ 例で使用したフィルタは確認後削除)
createFitlerAndApply関数
function createFitlerAndApply() {
let labelObjToName = getLabelObjToName_();
const userId = "me";
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const queryAndLabelRows = sheet.getRange("C:E").getValues();
for (const [query, labelName, created] of queryAndLabelRows) {
if (!query) {
break;
}
if (!labelName) {
continue;
}
if (created === 2){
continue;
}
let labelObj = labelObjToName[labelName];
if (typeof labelObj === 'undefined') {
labelObj = Gmail.Users.Labels.create({ name: labelName }, userId);
labelObjToName[labelObj.name] = labelObj
}
f = new Filter(query, labelObj,created)
f.createAndApply();
}
}
4. 復旧処理: ルールの見直しなど
整理作業が完了した後には、振り分けられたメールを見直すことも重要です。
1. フィルタの動作で「削除」を設定したフィルタの削除をします
受信トレイのメールを「メールの整理」作業中に増やさないために、ストップしていた「カテゴリ」からのメールを再開します。
① カテゴリに適用していた 「フィルタの動作」が「削除」を設定したフィルタを削除します。
「カテゴリ」のフィルタを削除した時に、受信トレイに「復元」されるメールを確認し、引き続きそのメールを「削除」したい時は、「フィルタの動作」で削除を指定した「フィルタ」を作成します。広告・メルマガ等購読の停止で対応出来る場合は、その対応を検討します。
② 適用条件に該当するメールに適用していた 「フィルタの動作」が「削除」を設定したフィルタを削除するかどうか検討します。
引き続き、フィルタを変更せず削除(ゴミ箱へ移動)とするか、フィルタを削除するかを決定します。
2. フィルタの動作で「受信トレイをスキップ」を設定したフィルタの見直しを行います
引き続き、フィルタを変更せず 受信トレイをスキップするか、受信トレイに表示する(残す)かを決定します。
3. 「ゴミ箱」や「ラベル」に振り分けられたメールを確認します
「ゴミ箱」や「ラベル」のメール一覧を確認し、メールが適切に振り分けられているかを確認します。
メールの整理作業は、確認するメールの量が多くなるため、 長くとも2,3日に留めるのが理想です。
メールを見直す際には、次の点に注意しましょう
メールが「検索」によって誤って削除されていた場合
・メールを選択して復元(必須)
・フィルタを作成(任意)メールが「フィルタ」によって誤って削除されていた場合。
・該当のフィルタを削除
・ フィルタを更新。フィルタの「適用条件」に一致するメールをゴミ箱から選択して、更新(修正)した「フィルタの動作」を適用メールが「検索」によって誤って「ラベル付け」されていた場合
・メールを移動(必須)
・フィルタを作成(任意)メールが「フィルタ」によって誤って「ラベル付け」されていた場合
・該当のフィルタを更新。受信済みのメールにも更新した「フィルタ」を適用誤って 「ゴミ箱」や「迷惑メール」に振り分けられている場合
・ メールを選択してラベルをつけて復元(移動)
・適用条件を作りフィルタを作成して復元(移動)新たな受信トレイのメールに対しても適切にフィルタリングが行われるように設定を調整します。
メールを見直す作業は「メールの整理作業完了後」だけでなく 定期的に行うことで、適切なメールが正しくラベル付けされ、望ましくないメールがフィルタリングされる可能性が高くなります。
定期的な整理作業とルールの見直しを行いながら、効率的なメールの管理を心がけましょう。
何事もそうですが、長く放置しては行けません。←
再び「上田敏」のこの言葉で締めくくりたいと思います。
一日延ばしは時の盗人である
プログラム全文
front.gs
実行する関数があるファイルです。処理する内容を 「common.gs 」から呼び出します。
/**
* このプログラムを実行する。
* displayEmailCount: 受信トレイの差出人のメールアドレス、名前、件数を出力する
*/
// 受信トレイの差出人のメールアドレス、名前、件数を出力する
function emailCountAndSearchCondition() {
// const currentTime = new Date(); // 現在日時
// const twoYearsAgo = new Date(currentTime.getFullYear() - 2, currentTime.getMonth(), currentTime.getDate());
// 検索条件を指定する
/** 受信トレイのメールを検索する */
const query = "is:inbox";
/** 受信トレイにある2年以上前のメールを検索する */
// const query = "is:inbox before:" + formatDate_(twoYearsAgo);
FirstSheet.display(query)
SecondSheet.display();
}
function createFitlerAndApply() {
let labelObjToName = getLabelObjToName_();
const userId = "me";
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const queryAndLabelRows = sheet.getRange("C:E").getValues();
for (const [query, labelName, created] of queryAndLabelRows) {
if (!query) {
break;
}
if (!labelName) {
continue;
}
if (created === 2){
continue;
}
let labelObj = labelObjToName[labelName];
if (typeof labelObj === 'undefined') {
labelObj = Gmail.Users.Labels.create({ name: labelName }, userId);
labelObjToName[labelObj.name] = labelObj
}
f = new Filter(query, labelObj,created)
f.createAndApply();
// Logger.log(`${query}:${label}`);
}
}
function getLabelObjToName_() {
let response = Gmail.Users.Labels.list("me");
let labelObjToName = {};
for (const label of response.labels) {
labelObjToName[label.name] = label;
}
return labelObjToName;
}
common.gs
共通モジュール。front.gsから呼び出される。このファイルは実行不可です
/**
* 共通モジュール
* 全て「private」関数として実行出来ないようにする
*/
class EmailCount {
constructor(query) {
this.query = query;
this.PAGE_SIZE = 500;
}
/**
* 検索条件に一致するメールを取得する
*/
getSearchMailList() {
let start = 0;
let allEmails = [];
while (true) {
var threads = GmailApp.search(this.query, start, this.PAGE_SIZE);
if (threads.length === 0) {
break;
}
Logger.log(start);
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
var message = messages[j];
allEmails.push(message.getFrom());
}
}
start += this.PAGE_SIZE;
}
Logger.log(allEmails);
if (allEmails.length === 0) {
Logger.log("受信トレイにメールはありません。");
}
return allEmails;
}
getEmailCountMap() {
let emailCount = {};
const allEmails = this.getSearchMailList();
if (allEmails.length > 0) {
let EmailParts = allEmails.map((email) => { return this.getEmailParts(email) })
EmailParts.forEach((emailList) => {
var address = emailList[1];
if (emailCount[address] == null) {
emailCount[address] = [emailList[0], 1];
}
else {
emailCount[address] = [emailList[0], emailCount[address][1] + 1];
}
})
Logger.log(emailCount);
}
return emailCount;
}
/**
* 例) Chatwork <noreply@chatwork.com>
* の形式を 「名前」と 「メールアドレス」に分割する
*/
getEmailParts(email) {
// メールアドレスと名前を分割する
let emailParts = email.match(/(.*?)(\s?)<(.*?)>/);
let name = email
let emailAddress = email
if (emailParts) {
name = emailParts[1];
emailAddress = emailParts[3].replace('<', '').replace('>', '');
}
Logger.log('メールアドレス: ' + emailAddress);
Logger.log('名前: ' + name);
return [name, emailAddress];
}
}
let FirstSheet = {
display: function (query) {
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]
sheet.clear();
sheet.setName("差出人とメール件数")
let ec = new EmailCount(query)
const data = ec.getEmailCountMap()
let rowIndex = 1;
for (const key in data) {
let values = data[key];
values.unshift(key)
sheet.getRange(rowIndex, 1, 1, 3).setValues([values]);
rowIndex++;
}
sheet.getRange("A:C").sort({ column: 3, ascending: false })
}
}
class Filter {
constructor(query, labelObj, created = 1) {
this.query = query;
this.labelObj = labelObj;
this.userId = "me";
this.created = created;
this.removeLabelIds = ['INBOX', 'SPAM'];
}
createAndApply() {
if (this.created === 1) {
this.create();
}
this.apply();
}
/**
* フィルタを作成
*/
create() {
if (this.created !== 1) {
Logger.log(`${this.query}: フィルターの作成をスキップします。`);
return;
}
let filter = Gmail.newFilter();
filter.criteria = Gmail.newFilterCriteria();
filter.criteria.query = this.query;
filter.action = Gmail.newFilterAction();
filter.action.removeLabelIds = this.removeLabelIds;
filter.action.addLabelIds = [this.labelObj.id];
try {
Gmail.Users.Settings.Filters.create(filter, this.userId);
} catch(e){
Logger.log(`${this.query}: 同じフィルタが既に作成されています`);
}
}
/**
* 既存のメールに「フィルタ」を適用してラベルに移動
*/
apply() {
if (this.created === 2) {
Logger.log(`${this.query}: スレッドへの適用をスキップします。`);
return;
}
const resource = {
"addLabelIds": [this.labelObj.id],
"removeLabelIds": this.removeLabelIds
};
const userId = this.userId;
let nextPageToken = null;
while (true) {
var threads = Gmail.Users.Threads.list(userId, {
q: this.query,
maxResults: 500,
pageToken: nextPageToken
}
);
nextPageToken = threads.nextPageToken;
threads.threads.forEach(function (thread) {
Gmail.Users.Threads.modify(resource, userId, thread.id);
});
if (!nextPageToken) {
break;
}
}
}
}
let SecondSheet = {
display: function () {
const sheetName = "検索条件"
let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
let inputSheet = spreadsheet.getSheets()[0];
let outputSheet = spreadsheet.getSheetByName(sheetName);
if (!outputSheet) {
outputSheet = spreadsheet.insertSheet(sheetName);
}
let emailRows = inputSheet.getRange("A:C").getValues();
// const singleEmailList = emailRows.filter(row => row[2] === 1).map(row => row[0]);
// const overlapEmailList = emailRows.filter(row => row[2] > 1);
// Logger.log(overlapEmailList)
outputSheet.clear();
let rowIndex = 1;
for (const [email, name] of emailRows) {
if (!email) {
break
}
outputSheet.getRange(rowIndex, 1, 1, 3).setValues([[email, name, `from:${email}`]]);
rowIndex++;
}
// 検索条件のシートをコピーして 「フィルタ」を作る 土台とする。
outputSheet.copyTo(spreadsheet);
/*
const step = 30;
let index = 0;
while (true) {
var emailList = singleEmailList.slice(step * index, step * (index + 1));
if (emailList.length === 0) {
break;
}
outputSheet.getRange(rowIndex, 1).setValue(`from:(${emailList.join(' OR ')}) is:inbox`);
index++;
rowIndex++;
} */
}
}
// 日付を指定の形式にフォーマットするヘルパー関数
// function formatDate_(date) {
// const year = date.getFullYear();
// const month = ("0" + (date.getMonth() + 1)).slice(-2);
// const day = ("0" + date.getDate()).slice(-2);
// return year + "/" + month + "/" + day;
// }
サービス
Gmailとは
Gmailは、Googleが提供する無料の電子メールサービスです。
Gmailでは、メールの送受信だけでなく、次の様な機能も利用することができます。
受信トレイ: 他の人から送られてきたメールが表示される場所です。新しいメールが届くと、受信トレイに表示されて未読としてマークされます。
メールの検索: 多くのメールを管理する場合でも、Gmailでは強力な検索機能を使って特定のメールを簡単に見つけることができます。
ラベル: メールをカテゴリ分けしたり、重要なメールをマークしたりするためにラベルを使用することができます。
フィルタ: 特定の条件(※ 検索条件で指定)のメールを振り分けることが出来ます。
Gmailの画面構成
Gmailの画面構成(UI)について説明します。
メールの整理に関係する画面構成を把握することで、メールの整理手順が分かりやすくなると思います。
トップ(ホーム)画面
Gmailのトップ画面の構成は以下のようになっています。
ヘッダー: ヘッダーは画面の最上部にあります。Gmailのロゴや検索バー、メニューアイコン、設定などの機能が含まれています。
ナビゲーションペイン: ナビゲーションペインは左側にあり、メールアカウントのラベル、受信トレイ、重要なメール、スター付きメール、下書き、送信済みメール、ゴミ箱などのフォルダやラベルが表示されます。また、追加されたカスタムラベルもここで表示されます。
メール一覧: メール一覧は中央に表示され、選択したフォルダやラベルに含まれるメールが一覧表示されます。メールの件名、差出人、日時などが表示され、未読メールは太字で表示されます。メール一覧では、メールを選択して開くことができます。
メールに対する操作
メールに対する「操作」としては、主に次の様なものがあります。
1. アーカイブ: メールをアーカイブします。アーカイブされたメールは受信トレイから削除されます。メールアカウント内の「すべてのメール」に移動します。アーカイブされたメールは後で参照するために保持されます。今回の作業では メールを「アーカイブ」する時に 「ラベル」を必ず付けます。
2. 削除: メールを削除します。削除されたメールはゴミ箱に移動し、一定期間後に完全に削除されます。ゴミ箱内のメールも削除できます。(「ゴミ箱」ラベルが付きます。)
3.既読/未読: メールの既読/未読ステータスを変更します。未読のメールは太字で表示され、既読のメールは通常のフォントで表示されます。
4.移動: メールを別のフォルダやラベルに移動します。メールを特定のカテゴリやプロジェクトに関連付けたり、メールを整理したりするために使用できます。
5.ラベル: メールにラベルを適用します。ラベルはカスタムのタグやカテゴリとして機能し、メールを簡単にグループ化したり絞り込んだりできます。
6.転送: メールの転送を行います。転送はメールを他の人に転送することです。
7. その他 > メールの自動振り分け設定: メールのフィルタルールの作成を行います。
設定画面
続いて 「フィルタルール」の作成・更新を行う設定画面について説明します。
設定画面の開き方
1.ヘッダーの「歯車アイコン」をクリックします。
2. [すべての設定を表示] ボタンをクリックします。
3. 設定画面が開きます。
設定画面のタブについて
設定画面のタブ(メニュー)について設定できる項目を簡単に説明します。
全般:一般的なGmailの設定や表示オプションを調整します。
ラベル:メールに対するラベルの作成、編集、削除などを行います。
受信トレイ:受信トレイの表示方法やソート順、重要メールのマーキングなどを設定します。
アカウント:Gmailアカウントに関する基本的な設定、プロフィールの変更、パスワードの管理などができます。
フィルタとブロック中のアドレス:メールの自動フィルタや特定のアドレスのブロックなどを設定します。メールに設定した「フィルタルール」はここで確認出来ます。
メール転送と POP/IMAP:メールの転送先やPOP/IMAPアクセスの設定、メールの取り込み方法などを管理します。
アドオン:Gmailに追加できるアドオンや拡張機能の管理や設定を行います。
チャットと Meet:Google ChatやGoogle Meetの設定、通知の管理、会議の予定などを行います。
詳細:高度なGmailの設定オプションや表示設定、キーボードショートカットのカスタマイズなどを行います。
オフライン:オフラインでのメールの閲覧や作成、同期設定の管理などを行います。
メールの検索
検索は、Gmailの検索バーに「検索条件」を直接入力すると検索出来ます。
「検索オプション」から 「フィルタを作成」をクリックすることで、「検索条件」から 「フィルタ」を作る事も出来ます。
Google Apps ScriptのGmailサービスでは、`search()`メソッドを使用して検索条件をプログラム内で指定することができます。
Gmailの検索バーに直接入力して検索
and条件
検索条件を組み合わせて 「半角スペース」で区切ると 「and」J(かつ)の意味になります。
例)差出人 「discord.app」かつ 「受信トレイ」を対象に検索する場合。
「from: discord.app is:inbox」と検索条件の間に 「半角スペース」を追加して、検索バーに入力します。
「検索オプション」で検索条件の詳細を確認すると、Fromが「discord.app」、検索が 「受信トレイ」となっており、受信トレイを対象に検索が行われる事が分かります。
OR条件
検索条件の いずれかに一致させたいという場合は 「OR」を使用します。
例)差出人 「discord.app」または 「受信トレイ」を対象に検索する場合。
プログラムから検索する場合
GmailAppクラスの 「search」メソッドを使います。
例)差出人 「discord.app」かつ 「受信トレイ」を対象に検索する場合。
GmailApp.search('from:discord.app is:inbox', 0, 500)
検索条件の指定方法
「検索条件」で使用される指定方法の一例です。
これ以外にも日付を指定してメールを検索したりする事も出来ます。詳しくは「参考資料」を確認してください。
検索条件を ANDで検索するときは、「半角スペース」 を使用します。いずれか(複数)の検索条件に一致させたい場合は 「OR」で検索条件を繋ぎます。
is:inbox: 受信トレイにあるメールを検索します。
is:trash: ゴミ箱にあるメールを検索します。
is:spam: 迷惑メールフォルダにあるメールを検索します。
has:attachment: 添付ファイルを含むメールを検索します。ちなみにファイルサイズを指定しての検索(larger: smaller:)も可能です。
from:example@example.com: 指定した差出人からのメールを検索します。複数のメールアドレスを検索したい場合は、from:(example@example.com OR from:example1@example.com)のように OR条件でメールアドレスを結びます。
to:example@example.com: 指定した宛先に届いたメールを検索します。複数のメールアドレスを検索したい場合は、to:(example@example.com OR from:example1@example.com)のように OR条件でメールアドレスを結びます。
subject:keyword: 指定したキーワードが件名に含まれるメールを検索します。
label:labelName: 指定したラベルが付いたメールを検索します。
参考:Gmailで使用できる検索演算子
ラベルの管理
ラベルについて
ラベルは、メールを整理するために使用されるカスタムのタグやカテゴリです。ラベルを使用することで、メールを関連するテーマやプロジェクトごとにグループ化する事が出来ます。ラベルを活用することで、メールの整理と効率的なメールの管理が実現できます。
ラベルの作成方法
ラベルを作成する方法は次の手順です。「フィルタ」を作成・更新する時にも、ラベルを付けるにチェックを付けて、「新しいラベル…」を選択する事でもラベルを作成することが出来ます。
1. 左側のナビゲーションペインで「ラベル」のセクションを見つけます。
2.「+」アイコン または 「新しいラベルを作成」をクリックします。
3. 「新しいラベル」ウィンドウで ラベルの名前を入力します。
4. 必要に応じて、「次のラベルの下位にネスト」にチェックを付けて、親ラベルを選択するか、新しい親ラベルを作成します。
5.「作成」ボタンをクリックしてラベルを作成します。
参考)フィルタの作成からのラベル追加
フィルタの作成の時に、ラベルを作成することも出来ます。手順は次の通りです。フィルタを使用しての「メールの整理」の作業を行う場合は、こちらのケースが多いかもしれません。
1.メールリストから メールを選択する。「フィルタを作成」ボタンをクリック
2.「ラベルを付ける」に チェックを付け 「新しいラベル…」をクリックします
ラベルの使用方法
Gmailのラベルを使用してメールを整理するためには、以下の方法があります。
ラベルをメールに適用する: メールを開いた状態で、ラベルの一覧から該当するラベルを選択します。複数のラベルを適用することも可能です。
ラベルによるメールの絞り込み: Gmailのナビゲーションペインのラベルセクションから、特定のラベルを選択することで、そのラベルに関連するメールのみを表示できます。
ラベルによるメールの自動分類: Gmailの設定からフィルタを作成し、特定の条件に基づいてメールを自動的に特定のラベルに割り当てることができます。
ラベルの色付け: ラベルにはカラーコードを設定でき、メールリストやメール詳細ビューでラベルの色が表示されます。色付けにより、視覚的に異なるラベルを識別しやすくなります。
ラベルを付けることの利点
メールにラベルを付けることで、主に次のような利点があげられます。
メールの見つけやすさ: ラベルを使用することで、メールをテーマやプロジェクトごとにグループ化することができます。特定のラベルを選択することで、関連するメールのみを表示することができます。これにより、特定のトピックやプロジェクトに関連するメールを素早く見つけることができます。
自動分類とフィルタ: フィルタ機能を使用して、特定の条件に基づいてメールを自動的にラベル付けすることができます。例えば、特定の差出人からのメールを特定のラベルに自動的に割り当てたり、特定のキーワードを含むメールを特定のラベルに分類したりすることができます。これにより、手動でラベルを適用する手間を省き、メールの整理を効率化することができます。
ラベルの柔軟な管理: Gmailでは、ラベルの作成、編集、削除が容易に行えます。必要に応じて新しいラベルを作成したり、既存のラベルの名前や色を変更したりできます。また、親子関係を持つラベルを作成することもできます。これにより、ラベルの階層構造を活用して、より詳細なメールの整理が可能となります。
フィルタと作成方法
Gmailのフィルタ機能を使うことで、特定の条件(※ 検索条件)に基づいてメールを自動的に処理することができます。
1. Gmailのフィルタとは?
Gmailのフィルタは、特定の条件に合致するメールを自動的に識別し、指定したアクションを実行する機能です。これにより、メールの整理や特定のメールの重要度を強調するなどの目的で使用することができます。
2. フィルタの作成手順
① 右上の歯車アイコンをクリックして「設定」を選択します。
②「クイック設定」の「すべての設定を表示」ボタンをクリックします
③「設定」画面の「フィルタとブロック中のアドレス」タブを選択します。
④「新しいフィルタを作成」をクリックします。
2.1 フィルタ条件の指定
差出人や受信者のメールアドレス、件名、キーワードなど、フィルタの適用条件を指定します。例えば、「差出人が○○の場合」や「件名に△△を含む場合」など、具体的な条件を設定します。
2.2 フィルタアクションの指定
フィルタにマッチしたメールに対して実行するアクションを指定します。例えば、「メールを削除する」、「メールをアーカイブする」、「特定のラベルを適用する」などのアクションを選択します。
3. フィルタの保存と有効化
フィルタの設定が完了したら、「フィルタを作成」ボタンをクリックして設定を保存します。これにより、指定した条件に合致するメールに対して自動的にフィルタが適用されます。
フィルタは今後送られてくるメールについて処理を行います。「一致するスレッドにもフィルタを適用する。」にチェックを付けることで「受信・送信済み」のメールにもフィルタを適用する事が出来ます。
フィルタ機能を使用することの利点
Gmailのフィルタ機能を活用することで、次のような利点があります。
メールの整理と効率化: フィルタを使用することで、メールを自動的に分類し整理することができます。特定の差出人やキーワードに基づいてメールを自動的にフォルダに分類したり、特定のラベルを適用したりすることができます。これにより、メールボックスを整理し、重要なメールや特定のプロジェクトに関連するメールを素早く見つけることができます。
メールの重要度の強調: フィルタを使用して、重要なメールを自動的に特定のラベルに割り当てることができます。重要なプロジェクトやクライアントからのメールを特別なラベルで強調表示することで、見逃すことなく重要なメールに対応できます。
自動化されたアクションの実行: フィルタを使用することで、特定の条件に合致するメールに対して自動的にアクションを実行することができます。例えば、特定の差出人からのメールを自動的に削除したり、特定のキーワードを含むメールを自動的にアーカイブしたりすることができます。これにより、手作業でのメールの処理を減らし、生産性を向上させることができます。
柔軟なカスタマイズ性: Gmailのフィルタ機能は非常に柔軟でカスタマイズ性が高く、さまざまな条件やアクションを組み合わせることができます。複数の条件を組み合わせたり、特定の条件にマッチしない場合(※)のデフォルトのアクションを指定したりすることも可能です。
Gmailのフィルタ機能を効果的に活用することで、メールの整理と管理をスムーズに行い、効率的に作業を進めることができます。