yamamanx

growing hard days

*

GoogleAppsScriptを使ってGmailをSpreadSheetにエクスポートする

      2015/03/02


GoogleAppsScriptを使ってGmailをSpreadSheetにエクスポートする

Google-apps-script-superman

そのまんまですが、Google Siteから実行出来るようにしました。

https://sites.google.com/site/yamamanx/tools/gmailexporter

動作仕様

  • 受信トレイのメール全てを対象に送信アドレス,受信日時,件名,本文(50,000文字まで)をSpreadSheetに出力します
  • SpreadSheetは[GmailExport_YYYYMMDDhhmmss]というファイル名でGoogle Driveに新規作成します
  • 出力したメールには[GmailExported]というラベルが作成されて付与されます

コード

もっとこうしたらいい、こうするべきってご意見があるとすごく嬉しく思います。

メイン処理

処理済ラベルの作成

SpreadSheetの作成

Gmailのmax rate対応

結果のメール送信

ブラウザ非依存日付文字列生成

コード解説

gmailExport

GmailAppのgetInboxThreads()メソッドでメールスレッドを取得。
0件の場合スレッド配列オブジェクトは出来るのでlengthプロパティで確認。

SpreadSheetAppクラスのcreate(ファイル名)メソッドで新規SpreadSheetを作成。

スレッド配列のループでスレッドメッセージ配列を取得。
スレッドメッセージ配列のループでメッセージオブジェクトを取得。
maxRateAvoidは後述。

MessageクラスのgetFrom(),getDate(),getSubject(),getBody()で各要素にアクセス。
 除去のためString.fromCharCode(160)でreplace対象を生成。
あわせてreplace(/<(“[^”]“|'[^’]‘|[^'”>])*>|nbsp/g,”)でHTMLタグも除去。
SpreadSheetのセルの限界文字列数50,000文字に切り取り。

各変数に入れたメール要素の文字列をセルに格納。

処理済のメールにラベルを付与する。

createProcessedLabel

GmailAppクラスのgetUserLabelByName(ラベル名)メソッドでラベルの有無を判定。
なければGmailAppクラスのcreateLabel(ラベル名)メソッドでラベルを作成。

createMailSheet(の作成

1つ目のシートにシート名を設定して1列目にタイトル行を作成。

maxRateAvoid

max rateにひっかかるからsleepしなさいってエラーが発生するので、ループ1回につき1秒待つ。
それでも90メールを超えるとエラーが発生するので90メールごとに100秒待つ。

mailSending

ログインユーザのオブジェクトをSessionクラスのgetActiveUser()メソッドで取得。
MailAppクラスのsendEmail(宛先,件名,本文)メソッドで送信。
スクリプトを作成したユーザと別ドメインのユーザではgetActiveUser()で何も帰らないようです。
メールアドレスとかを悪用出来ないようにしているのでしょうね。
今回はこのスクリプトをgmail.comユーザで作成しているのですが、
という事は同じAppsドメインなら同じ組織だからいいけど、
gmail.com同士はきっと他人だからだめなんでしょうね。

toOriginalDateString

YYYYMMDDhhmmss文字列をブラウザに依存せずに生成。

以上です。

@yamamanx
開発ベンダー5年、ユーザ企業システム部門通算8年目のSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。

 - Google, GoogleAppsScript ,

ad

ad

Message

メールアドレスが公開されることはありません。

  関連記事

Redmine-Logo-CyberSprocket-Composite-300x300-png8 copy
RedmineにGoogleAppsアカウントでログイン出来るようにする

RedmineのログインをGoogleアカウントで出来るように[redmine_ …

chromium_icon
chromium OS をインストールするためのUSBをMacで作る

別にChromeBookを購入するお金をけちるわけではないのですが。 chrom …

Google-apps-script-superman
GoogleAppsScriptを使ってGmailの本文を解析してSpreadSheetにエクスポートする

GoogleAppsScriptを使ってGmailの本文を解析してSpreadS …

Google_Calendar_API_v2_Atom_Reference_-_Google_Calendar_API_—_Google_Developers
Googleカレンダーの予定をPHPからXMLで取得してWebページに表示する(現在廃止されたAPIなので使えません)

ご注意 ※下記の記事で使用していたAPIは2016年現在使用出来なくなっています …

googlesite
Google関連のAPIを試すためのGoogleSiteを作ってみました

組み込み機能で出来る事は組み込み機能で と思いまして、Googleサイトを試験的 …

google_calendar_api
Googleカレンダーの予定をV3 APIでPHPからJSONを取得してWebページに表示する

Googleカレンダーを使って管理しているライブスケジュールを日付によって、 未 …

6807_normal_1445518290_gdgkobe-badge
「Cloud Vision Api & Tensorflow勉強会」に行ってきました

「Cloud Vision Api & Tensorflow勉強会」に行 …

Redmine-Logo-CyberSprocket-Composite-300x300-png8 copy
redmine_omniauth_googleプラグインをRedmine3.0.0で動くようにする

redmine_omniauth_googleプラグインをインストールしたところ …

Admin_SDK_Directory_Service_-_Google_Apps_Script_—_Google_Developers
Google Apps ScriptでAdmin SDK Directory Serviceを使ってグループメンバー情報を出力する

GoogleAppsのGoogleGroupをメーリングリストとして使っている人 …

Cyclemeter-google-map
自転車でナビ+記録出来るアプリ+ホルダー+バッテリー試してみた

目的 記録を蓄積して振り返りやる気を継続する 飽きないように単調にならないように …