Humanity

Edit the world by your favorite way

Google Apps Script で Gmail の添付ファイルを自動で Google Drive に保存

そういえばこんなもの作ってたので、備忘録がてらブログにも書きます(2ヵ月近く経ってますが…)。

使用方法

使う時は

  1. 専用の Google Drive フォルダを作成
  2. 専用の Gmail のラベル(保存済み用マーカー)を作成
  3. Google Apps Script の Home から以下のコードをコピペ
  4. SAVE_FOLDER_ID (保存したい Google Drive のフォルダの ID)を 1 で作ったフォルダの ID に変更
  5. READ_LABEL_NAMEGmail ラベル)を 2 で作ったラベル名に変更
  6. あとはお好みで定期的に自動実行させたい場合はトリガーを作成
    • (あんまりいないと思いますが)手動実行で運用したい人は不必要

保存したい 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;

自動実行させるためにトリガーを作成

とりあえず現在だとエディター画面の上部メニューから「編集→現在のプロジェクトのトリガー」でトリガーの画面を開いた後、右下の「トリガーを追加」ボタンから作成できます。 自分はこんな感じで作りました。

f:id:tyru:20190321123620p:plain
給与明細保存スクリプト - トリガー設定

コード

BSD cp だと source のパスの末尾に "/" が付いていると中身をコピーする

どういう事かというと

という事です(手抜き記事)。

Vim のレジスタに :terminal のシェル上からアクセスする

Vim その2 Advent Calendar 2018 の記事です。

Advent Calendar 4日目で mattn さんが紹介してくれていた Tapi について、 ちょうど Tapi を使ったプラグインを作っていたので紹介したいと思います。 実際にこんな事ができるという例としてもシンプルで分かりやすいと思います。

概要

github.com

tapi-reg.vimVimレジスタと端末の標準入力/出力を繋げるものです。 :terminal で動かしているシェル上に Vimレジスタの内容を出力したり、 逆にシェル上から Vimレジスタの内容を書き換えたりできます。

セットアップ

動作には jq コマンドが必要です。 インストールはほぼ全ての OS でパッケージが用意されています

jq コマンドをインストールしたら

source <this repo>/macros/vimreg.sh

を .bashrc に書いてください。 vimreg というコマンドが使えるようになります。

どんなことができるのか

以下は README をほぼそのまま英訳したものです。 詳しくは README を見て下さい。

:terminalVim: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
$

:terminalVimVimレジスタの内容を標準出力に出力する

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
$