BetterTouchToolでJavaScriptを使って、特定のキー入力で明日の日付をyyyy-MM-dd形式で入力する方法
今日も元気にノンプロ研でプログラミング勉強中です。
ノンプロ研とは、「ノンプログラマーのためのスキルアップ研究会」の略称で、ノンプログラマー(プログラミングを本職にしない人)たちが集まって、プログラミングを武器にすべくスキルを磨いているコミュニティです。
今日は、 ノンプロ研で学んだGAS(≒JavaScript)の知識を生かしていて、Macユーザにとっての神アプリBetterTouchToolをさらに便利なものにしたいと思います。
事務仕事で頻繁に登場する日付たち
経理などの事務仕事をしていると頻繁に登場する日付というのがあります。具体的には今日の日付だったり明日の日付だったり月末日の日付だったりします。
この頻繁に登場する日付たちを簡単に入力できるようにならないかというのが、今日の目的です。
キーシーケンス / タイプした単語による入力
BetterTouchToolで 特定の機能や動作を割り当てるのにいくつかの方法がありますが、今回はキーシーケンスと言う機能を使います。
キーシーケンスとは一連のキー操作のパターンことで、特定のキー操作を記録しておくことでBetterTouchToolの各種機能のトリガーにすることができます。
今日の日付の割当は比較的簡単
まずは、今日の日付の文字列入力をキーシーケンスのアクションとするようにします。
こちらは比較的簡単で、カスタムテキストの挿入/入力/貼り付けというアクションを選択し、(BTT)@dateformat:yyyy-MM-dd(BTT) のようにフォーマットを指定してあげることで、意図した形式で今日の日付が出力されます。
こちらのYouTubeを参考にしました。
ここまでは、こちらのブログ及びYouTubeの解説動画を参考にしました。
今日ができたなら明日も出力したい
ここからが今日の本題です。
今日の日付が出力できたので、気を良くして明日の日付も同じようにキーシーケンスで出力したいと思いました。
しかしながらネットの海を漂っていろいろ調べたところ、 今日の日付のように簡単にはいかなさそうです。
そもそも日本語の情報がほとんど見つけられませんでした。
BetterTouchToolはJavaScriptが使えるらしい
こういう時は…と、 日本語での検索を諦めて英語に切り替えました。その中発見したのは以下のサイトです。
How to add date/time for yesterday/tomorrow in insert text action?
とは、「テキスト挿入アクションで昨日/明日の日付/時刻を追加するには?」という質問で、まさにドンピシャです。
JavaScriptによる選択範囲の変換と置換アクションを使う
いきなり答えから言うとJavaScriptによる選択範囲の変換と置換アクションを使って、ほしい日付の戻り値を返すJavaScriptを書けば良いみたいです。
選択範囲の変換と置換と言われて、そもそも何も選択してないじゃん!と思ったのですが、先の英語のフォーラムでも選択しているかどうかは今回は気にしなくていいと書いていましたので、気にしないようにします。
ほかにも async って何だろう。調べると 非同期関数と言う言葉が出てきて、 ちょっと調べてみましたがあっという間に寝落ちしそうになったので撤退しました。
仮引数の clipboardContentString は、その名の通りクリップボードにコピーした文字列を引数にしているんだろうなと想像。
明日の日付をyyyy-MM-dd形式の文字列で返す関数
ということで、早速コードを書いていきます。
async (clipboardContentString) => {
const today = new Date();
const tomorrow = new Date(today.setDate(today.getDate() + 1));
const year = tomorrow.getFullYear();
const month = tomorrow.getMonth() + 1;
const day = tomorrow.getDate();
const formatTomorrow = year + '-' + month + '-' + day;
return formatTomorrow;
}
const today = new Date(); で今日の日付のDateオブジェクトを生成して
定数tomorrowで日付を1つ進めます
ここで、return tomorrowとしてしまうと Mon Dec 20 2021 21:49:39 GMT+0900 (JST) みたいな文字列が出力されるので
year, month(0スタートのインデックスなので +1), dayとそれぞれ数値で取得し
定数formatTomorrowでほしい形式の文字列に整えます
最後にformatTomorrowをreturnして戻り値として返します
同様の方法で、今月末とか来月末とかもできそう。
追記という名の訂正
上記のコードで欠陥が発覚しました。月日が1桁の場合、出力される日付文字列も1桁になってしまいます。
この問題、実は以前にも調べてました。
async (clipboardContentString) => {
const today = new Date();
const tomorrow = new Date(today.setDate(today.getDate() + 1));
const year = tomorrow.getFullYear();
const month = ('0' + String(tomorrow.getMonth() + 1)).slice(-2);
const day = ('0' + String(tomorrow.getDate())).slice(-2);
const formatTomorrow = year + '-' + month + '-' + day;
return formatTomorrow;
}
月日の部分には0を頭に足して、.slice(-2)でお尻2桁を切り取るという処理ですね。
GASではUtilities.formatDate()を使えばいいことを後で知り、意味ない記事を書いてしまったな…と思ったのですが、まさかここで回収できるとはですね。
おまけ:キーシーケンスの割当ガイドライン
今回の日付にどんなキーシーケンスを割当するのか、このあたりも今後シーケンスが増えていくことを見越した検討が必要です。
ポイントは2つで
日本語入力であまり使わないキーシーケンスが良い
出力されるものが連想されるキーシーケンスが良い
です。
日本語入力であまり使わないキーシーケンスが良い理由は、例えばasitaみたいなIME辞書登録的なキーシーケンスにアクションを割り当ててしまうと、本当に明日と入力したい時にもyyyy-MM-ddが出力されてしまいます。
一方で、出力されるものが連想されるキーシーケンスが良い理由は、アクションが増えてくるとどんなキーシーケンスに割り当てたかわからなくなり、結果使わなくなってしまうためです。
今回は日付に関するキーシーケンスということで、
「dayの頭2文字をとってda + テンキーの数字」という組み合わせでアクションを割り当てました。末日の場合はEnd of Monthのemですね。
da0 → 昨日の日付
da1 → 今日の日付
da2 → 明日の日付
em1 → 今月末日の日付
em2 → 来月末日の日付
みたいな感じです。