Google Apps Script で Gmail の添付ファイルを自動で Google Drive に保存
そういえばこんなもの作ってたので、備忘録がてらブログにも書きます(2ヵ月近く経ってますが…)。
GAS で Gmail の添付ファイルを Google Drive に保存するやつできた。まとめてダウンロードできるので大分楽になった https://t.co/WCPSymK3yA
— tyru (@_tyru_) February 24, 2019
使用方法
使う時は
- 専用の Google Drive フォルダを作成
- 専用の Gmail のラベル(保存済み用マーカー)を作成
- Google Apps Script の Home から以下のコードをコピペ
SAVE_FOLDER_ID
(保存したい Google Drive のフォルダの ID)を 1 で作ったフォルダの ID に変更READ_LABEL_NAME
(Gmail ラベル)を 2 で作ったラベル名に変更- あとはお好みで定期的に自動実行させたい場合はトリガーを作成
- (あんまりいないと思いますが)手動実行で運用したい人は不必要
保存したい Google Drive のフォルダを指定
var SAVE_FOLDER_ID = 'フォルダのID';
の部分を保存したい Google Drive のフォルダの ID に変えて下さい。 フォルダの ID はコメントにも書いてある通り Google Drive でフォルダに移動した時のURLで分かります。
例: https://drive.google.com/drive/u/1/folders/{フォルダのID}
既読マーカー用 Gmail のラベルを指定
添付ファイルを保存したかどうかチェックするために付けるラベルです。
var READ_LABEL_NAME = '添付ファイル保存済み';
の部分を作った Gmail のラベルに変えて下さい。
特定のメールの添付ファイルのみ保存
var SEARCH_CONDITION = 'has:attachment -label:' + READ_LABEL_NAME;
の部分を好きなように変えて下さい。 例えば以下の様に件名で絞り込んだりできます。
var SEARCH_CONDITION = 'subject:"重要書類" has:attachment -label:' + READ_LABEL_NAME;
自動実行させるためにトリガーを作成
とりあえず現在だとエディター画面の上部メニューから「編集→現在のプロジェクトのトリガー」でトリガーの画面を開いた後、右下の「トリガーを追加」ボタンから作成できます。 自分はこんな感じで作りました。
コード
BSD cp だと source のパスの末尾に "/" が付いていると中身をコピーする
どういう事かというと
うおぉぉ… cp の -R オプションって BSD 版だと source directory path が / で終わるとその中身を destination directory にだばぁするのか。rsync 的な挙動。GNU 版は末尾が / でもそうでなくても関係ない。なんか今まで作ったシェルスクリプト怖くなってきたんだけど…
— tyru (@_tyru_) 2019年3月12日
$ mkdir dirA dirB
— tyru (@_tyru_) 2019年3月12日
$ touch dirA/{a,b,c}
$ cp -R dirA/ dirB/
$ ls -F dirB/
の結果が以下のどちらかになる。自分は今まで GNU の挙動しか知らなかった…
BSD: a b c
GNU: dirA/
man 見ると GNU は "copy directories recursively" だけなのに BSD は以下のような感じ。https://t.co/5Wz7DOCAdB
— tyru (@_tyru_) 2019年3月12日
という事です(手抜き記事)。
正直早々に /bin/sh で動かすように書こうとするのを諦めた身としては絶対にクロスプラットフォームなシェルスクリプトとか書きたくない気持ちがさらに強くなった(恐らくそんな機会はない)
— tyru (@_tyru_) 2019年3月12日
シェルスクリプトとは簡単な定型処理を自動化するために書き捨てる位の距離を保ってるのが一番ちょうどいい
— tyru (@_tyru_) 2019年3月12日
Vim のレジスタに :terminal のシェル上からアクセスする
Vim その2 Advent Calendar 2018 の記事です。
Advent Calendar 4日目で mattn さんが紹介してくれていた Tapi について、 ちょうど Tapi を使ったプラグインを作っていたので紹介したいと思います。 実際にこんな事ができるという例としてもシンプルで分かりやすいと思います。
概要
tapi-reg.vim は Vim のレジスタと端末の標準入力/出力を繋げるものです。
:terminal
で動かしているシェル上に Vim のレジスタの内容を出力したり、
逆にシェル上から Vim のレジスタの内容を書き換えたりできます。
セットアップ
動作には jq コマンドが必要です。 インストールはほぼ全ての OS でパッケージが用意されています。
jq コマンドをインストールしたら
source <this repo>/macros/vimreg.sh
を .bashrc に書いてください。
vimreg
というコマンドが使えるようになります。
どんなことができるのか
以下は README をほぼそのまま英訳したものです。 詳しくは README を見て下さい。
:terminal
→Vim: :terminal
から Vim のレジスタの内容を書き換える
Vim の :terminal
のバッファから vimreg
コマンド経由で Vim のレジスタの内容を書き換えることができます。
$ echo 'send this text to vim register!' | vimreg
これで無名レジスタに send this text to vim register!
の内容がセットされます。
もちろんレジスタ名を指定する事もできます。
$ echo 'send this text to register a!' | vimreg a
vimreg
は標準入力から文字列を取得するため、もちろんこのようにもできます。
$ vimreg This is sent to vim register. ^D $
:terminal
←Vim:Vim のレジスタの内容を標準出力に出力する
vimreg
は --get
(-g
) オプションをサポートしています。
これは Vim のレジスタの内容を標準出力に出力するものです。
もしレジスタ名が指定されなかったら、無名レジスタの内容が出力されます。
$ vimreg -g Hello this is vim unnamed register content. $ vimreg -g a this is "a" register content.
また Vim レジスタの一覧とその内容を出力する事もできます (:registers
の出力と同じ)。
$ vimreg -l --- Registers --- "" --- Registers ---^J"" ^J^J"0 if a:args[1] ==# '--list'^J^J"1 ^J^J"2 if a:args[1] =~# '\v^(-l|--list)$'^J^J"3 local reg='"'^J^J"4 set +x^J^J"5 set -x^J^J"6 set -x^J^J"7 "0 --- Registers ---^J"" ^J^J"0 if a:args[1] ==# '--list'^J^J"1 ^J^J"2 if a:args[1] =~# '\v^(-l|--list)$'^J^J"3 local reg='"'^J^J"4 set +x^J^J"5 set -x^J^J"6 set -x^J^J"7 "1 ^J "2 if a:args[1] =~# '\v^(-l|--list)$'^J "3 local reg='"'^J "4 set +x^J "5 set -x^J "6 set -x^J "7 content=^J "8 printf '\e]51;["call","Tapi_reg",["set",%s,%s]]\x07' \^J "$(to_json_string "$reg")" "$(to_json_string "$content")"^J "9 $(to_json_string "$3") "a degure "s " "- $list || ". --list ": call system('clip.exe', execute('registers')) "% macros/vimreg.sh "# plugin/tapi_reg.vim "/ --list
疑似クリップボードサポート (Windows Subsystem Linux (以下 WSL) のみ)
もちろん vimreg では has('clipboard') == 1
の場合にクリップボードの内容も扱えます (つまりシェル上から Vim 経由でクリップボードの取得・設定もできます)。
しかしWSL では has('clipboard') == 0
にもかかわらずクリップボードを扱えるようになっています。
$ vimreg + Send this text to clipboard ^D $