【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仕様書のビュワー作るとか
楽しみだ

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に設定する

  1. cmd + ,
  2. 設定の検索にplantuml jarと入力
  3. ヒットした中からPlantuml: Jarを探す
  4. 入力欄に先ほど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

結果的に生成されるリストは同じですが実行順が違います
気をつけないと間違えそうですね