#1 はじめに
Gmailを共有するためにGoogle Driveに保存したいというニーズがあったので対応しました。
Gmailの中でラベルを付ければできることなのですが、機密性が高く宛先を制限せざるを得ないメールの受信者が退職したら見れなくなったという問題があったので開発しました。
#2 処理内容
const label_name = "ラベルの名前"
const query = "label:" + label_name;
const threads = GmailApp.search(query);
const label_data = GmailApp.getUserLabelByName(q_label);
const dest = "保存先のID"; // Google Driveの"folder/"以降の文字列を代入
ここは、条件を指定してメールを検索します。変数queryにはラベル以外にも期間、タイトルなども含めることができます。こちらに詳細な条件があります。
for(let n in threads){
複数のメールを保存するためにforループを回してます。
let thread = threads[n];
let msgs = thread.getMessages();
getMessages関数でメールのデータを取得しています。msgsにはGMailのデータが格納されています。
今回使用したのはgetId関数とgetPlainBodyだけですが、機能拡張したら追記していきます。
関数 | 分類 | 取得できる情報 |
---|---|---|
getFrom() | アドレス | 送信元アドレス |
getTo() | アドレス | Toアドレス |
getCc() | アドレス | Ccアドレス |
getBcc() | アドレス | Bccアドレス |
getReplyTo() | アドレス | 返信先のメールアドレス |
getSubject() | 文章 | 件名 |
getPlainBody() | 文章 | テキスト形式のメール本文 |
getRawContent() | 文章 | HTML形式のメール本文 |
getBody() | 文章 | HTML形式のメール本文 |
getAttachments() | 添付ファイル | 添付ファイル |
getDate() | その他 | 送信日時 |
getHeader(name) | その他 | ヘッダ |
getId() | その他 | ID |
for(let m in msgs){
let msg = msgs[m];
let subject = msg.getSubject();
let description = msg.getPlainBody();
let date = Utilities.formatDate(msg.getDate(), 'JST', 'yyyyMMdd_HHmm');
メール1件ごとに件名、本文、送信日時を取得しています。ファイル名は件名だけでも良いのですが、いつ贈られたかをソートしたかったので日付を追加しています。
let doc = DocumentApp.create(date + "_" + subject);
doc.getBody().setText(description);
let docid = doc.getId();
let file = DriveApp.getFileById(docid);
取得したメール情報を使ってGoogle Doc形式で保存します。今回は本文の文章だけが必要なのでgetPlainBody()関数を使っています。HTMLの解析をして必要な部分を取り出すとかするのであれば、getBodyを使っても良いのかと思います。
thread.removeLabel(label_data);
}
}
保存したプログラムに貼ってあったラベルを外します。これをやらないと以前に保存したものまで対象になるからですね。
このままのプログラムだと、GASのあるドライブにファイルがたまっていくので、特定のフォルダに保存した場合は、以下のように保存したファイルを移動する必要があります。
const folder = DriveApp.getFolderById("");
file.moveTo(folder);
destにはGoogleのフォルダIDを設定してください。以下の部分です。
https://drive.google.com/drive/u/1/folders/{フォルダID}
3 最後に
手動でラベルを貼らなければいけないという手間はかかりますが、件名や日付などでフィルタリングできない場合には便利かと思います。
4 参考サイト