【GAS】Gmailからメールを検索する
Gmailからメールを検索する方法はググるとたくさんヒットするけど、どれも微妙だから自作した。
諸悪の根源はThread
メールの検索にはGmailApp.search()
てメソッドを呼ぶけど、こいつがよくわからん。
なぜか戻り値がスレッドのリスト。。
メールのリストを返してくれれば良いのに。。
完成品
POINT 1: スレッドを全部展開する
2次元のfor文で中身を掘る。
POINT 2: 同一IDの除去
スレッドの仕様がよくわからないけど、展開しただけだと同じメールが複数件ある可能性がある。 なので同一IDを除去する。
POINT 3: ソート
検索結果はどうゆう順に取れるのかよくわからないので、日付でソートする。
とりあえずこれで完成。 ただし、メールが取得できたからと言って安心できない。
つらみ
メールの日付とは何か
getDate()
で日付が取れるけど、これもよくわからない。
仕様書には
The date and time of this message.
と書いてあるけど、ざっくりしすぎ。。 受信したシステム日付であることを祈る。
ちなみに日付が送信者の言い値だと辛い。
メールサーバが滞留して1日遅れで届いた場合に、昨日の日付のメールが急に届く。例えば「1時間毎に試着メールをチェックする」みたいな処理を仕掛けると、昨日の日付のメールが急に届いてもメールのチェック対象から外れてロストする。。
本文が取れない
本文はgetPlainBody()
で取れるが、本文サイズが大きすぎると取得できない。(仕様にないけど...)
なので例えばシステムから飛んでくるメールに対して
「エラー」って文字列があったらslackに通知する
みたいな処理を書いていて本文サイズが大きくて取得できなかった場合、これも処理されずにロストする。
まとめ
GASは手軽で便利だけど、危険がいっぱいだから慎重に使おう。
webサイトのタイトルとURLを取得するブックマークレット
ネットで見つけた記事をSNSやチャットで共有したい。
今時共有機能なんてどんなアプリにも付いてるだろと思うけど、実際はURLしか共有されない。タイトルも共有してほしいんだけど。。
表示するアプリによっていはOGP(Open Graph Protcol)とかで補完されてタイトルも表示されるけど、対応してない場合もあって微妙。
ってことで、ブックマークレット作った。
共有ブックマークレット
chrome
javascript:prompt('', `${document.title}\n${location.href}`)
chromeはalertの内容をコピペできないのでpromtを使う。
firefox
javascript:alert(`${document.title}\n${location.href}`)
firefoxのpromptはテキストの改行が効かないからalertを使う。
チャットワーク用
ちなみにチャットワークに共有するならinfoタグを使うと良い。
chrome
javascript:prompt('', `[info][title]${document.title}[/title]${location.href}\n[/info]`)
chromeはalertの内容をコピペできないのでpromtを使う。
firefox
javascript:alert(`[info][title]${document.title}[/title]${location.href}\n[/info]`)
【GAS】シートをDBのテーブルっぽく使う
最近、GoogleAppsScriptにハマり始めた
GASはjsのバージョンが古くて好きじゃなかったけど、開発環境のセットアップが不要で気軽に始められるのが良い
で、いろいろ作ってるとスプレッドシートをDBのように扱いたくなるのでライブラリ化した
シートをDB化できると結構夢が広がる
例えば大量データのバッチ処理がしたい場合、通常はGASの処理時間制限にかかって処理できない
そこでシートをキューみたいに使って処理を分割すればこの制限を回避できる
しかもGASはWebAPIも作れるから、ちょっとしたサンプルアプリなら普通に作れそう
とりあえずGithubAPIを使って遊んでみようかと考え中
projectsのバーンダウンチャート作るとか、API仕様書(swagger)やDB仕様書のビュワー作るとか
楽しみだ
「ヤフーが語る、1on1の実際」を聞いた
田祐の「人事放送局」~有名企業の人事にズバリ聞く!~
というpodcastでヤフーの1on1の話が全4話で放送されていたので聞きました。
以下はそのまとめです。
vscode上のplantumlでマインドマップを書く
plantumlでマインドマップが書けるらしい。 シンタックスはこんな感じ
@startmindmap * Debian ** Ubuntu *** Linux Mint *** Kubuntu *** Lubuntu *** KDE Neon ** LMDE ** SolydXK ** SteamOS ** Raspbian with a very long name *** <s>Raspmbc</s> => OSMC *** <s>Raspyfi</s> => Volumio @endmindmap
http://plantuml.com/ja/mindmap-diagram
このコードをplantumlのプラグインをインストールしたvscodeに貼ると...エラー...
たぶんplantumlのバージョンが古い
なので自力でバージョンを上げてvscode上でマインドマップが書けるようにします
前提条件
vscodeにPlantUMLプラグインがインストールされていてクラス図等が書ける
最新のjarをDLする
下記リンクから最新版のjarをDLして任意の場所に置く
ダウンロードのページ
vscodeに設定する
cmd + ,
- 設定の検索に
plantuml jar
と入力 - ヒットした中から
Plantuml: Jar
を探す - 入力欄に先ほどDLしたjarのパスを書く
確認
さっきエラーになったコードをプレビューすると、ちゃんと表示されました。
まとめ
vscodeに最新のplantumlを適用してマインドマップが書けるようになりました
最新のplantumlはマインドマップ以外にもガントチャートやWBSが書けるっぽいから使ってみよう。
適当にmybatis用テンプレつくーる
風邪をひきました
そんな中コードを書いたらミスしまくりでイライラした
特にミスが多かったのがmybatis用に書くSQL文
1つのテーブルにINSERTしたりSELECTしたりするだけなんだけど。。
テストが全然通らない
カンマが多いだの、少ないだの、そんなカラム名ねぇ〜よだの、型違うだの
うぜーー
てことでCreateTable文から適当にmybatis用のテンプレを作ってくれるやつ作った
https://naosim.sakura.ne.jp/app/mybatistool/
相当テキトーだから自分のプロジェクトの書き方じゃないと動かないと思う
とりあえず雰囲気だけお楽しみください
javaのStream#map()とjsのArray#map()は実行順が違う
java8から追加されたmap
他の言語にも似た機能はありますが実行順が違うので備忘録的なメモ
javaのmap
Stream.of(1, 2, 3, 4, 5) .map(v -> { System.out.printf("%dに1を加える\n", v); return v + 1; }) .map(v -> { System.out.printf("%dを2倍する\n", v); return v * 2; }).forEach(v -> System.out.println(v));
jsのmap
[1, 2, 3, 4, 5] .map(v => { console.log(`${v}に1を加える`); return v + 1; }) .map(v => { console.log(`${v}を2倍する`); return v * 2; }) .forEach(v => console.log(v));
パっと見、まったく同じに見えますが実行してみると結果が違います
javaの実行結果
1に1を加える 2を2倍する 4 2に1を加える 3を2倍する 6 3に1を加える 4を2倍する 8 4に1を加える 5を2倍する 10 5に1を加える 6を2倍する 12
jsの実行結果
1に1を加える 2に1を加える 3に1を加える 4に1を加える 5に1を加える 2を2倍する 3を2倍する 4を2倍する 5を2倍する 6を2倍する 4 6 8 10 12
結果的に生成されるリストは同じですが実行順が違います
気をつけないと間違えそうですね