iPhone 「ショートカット」で作る時間管理ツール


##1. はじめに
iPhone のショートカットアプリと numbers で簡単な工数管理ツールを作ってみました。
タイマーとも連携していて、指定の時間経過するとアラームで知らせます。
なお、ios 15 で動作確認しています 14 では import 時にショートカットとして認識しませんでした。

使い物になれば、ご利用いただいても良いですし、機能を追加するなど何かの参考になれば幸いです。

##2. 使い方

|画像|ShortCuts での入力|
|---|---|
|![IMG_3695.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/cb5cc71f-3391-c6e0-5788-e048b9021340.jpeg)|ショートカットからタイムトラッキングを選ぶ|
|![menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/55ffe2d4-e6bc-b5fc-5a1f-b6a4af8f334d.png)|記録する作業を選択|
|![IMG_3693.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/7f1881aa-64c7-e5fa-4727-693914dfc35a.jpeg)|時間を設定|
|![IMG_3694.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/208317f7-1395-436d-1925-5d9d96378587.jpeg) |コメントあれば書く|
|![IMG_3697.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/fdb2994c-bd81-b1d0-3d37-ad33eb8ea9fc.jpeg)| 指定した時間のタイマーがセットされ、指定の時間経過するとアラームで知らせてくれます。<BR><BR>タイマーアプリの仕様かとおもいますが、<BR>すでにタイマーが設定されていた場合のみ、このように時間確認の画面が表示されます。|

|iPhone の Numbers アプリで集計|
|---|
|Numbers アプリで毎回の記録が自動集計されグラフ表示されます
![IMG_3696.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/eb4629c4-99dd-75ad-3979-8feaadcf1a2b.jpeg)　|

##3. iPhone にインストールして使ってみる

1. iPhone に「ショートカット」アプリと 「numbers」 アプリをインストールしておきます。

2. iPhone で信頼されていないショートカットを有効にします。

    「設定] -> 「ショートカット」 -> 「信頼されていないショートカットを・・・」　これを「ON」にします。

3. iPhone から以下の URL をアクセスし、ショートカット「タイムトラッキング」 をダウンロードします。
https://www.icloud.com/shortcuts/075e6047dcfb47d7add7e28d1437903f

4. 実行してみる
ダウンロードした「タイムトラッキング」を実行してみます。初回は numbers のシートをダウンロードするのみで終了します。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/48e20087-495a-ef4e-af81-4e0a86f49a6d.png)

5. 動作確認してみる。
数分の間隔をあけて適当に作業項目を選択し記録してみます。その集計が numbers のシートに反映され円グラフの比率が変わる事などを確認できれば OK です。<BR>
※数分の間隔をあけているのは、例えば 1:10 に開始して 1:10 に終了しても 0 分の作業時間となり円グラフに反映されず、分かりにくいからです。
##4. 補足

**選択項目を変更・追加する場合**

- 「5.タイムトラッキングの内容説明の②」にある項目を追加 or 変更します。　<BR>例えば「調査」を「プログラミング」に変更するばあい、"調査" という文字列をすべて"プログラミング"に変更します。
![Oct31c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/1344087d-a67a-bf42-0275-3097853ea277.png)

- 「6.numbers シートの説明①②」も同様に、対応したセルの計算式を "調査" から "プログラミング" のように対応した種類を参照するように変更・追加します。

||
|---|
![IMG_3725.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/a387c89c-2e98-fcbb-0dbd-1514940603c0.png)|
下記の設定も、参照しているセル名 "分 調査" から "分 プログラミング" に変更ですね。

||
|---|
![IMG_3726.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/f7f67ac3-c755-8cfd-5453-ceb621f6fcb5.png)|

- それと上記の集計 A2 の "調査" 文字列も "プログラミング" など変更したい値へ変えておきます。
- 項目を追加する場合は、新しい行を集計に加え、同じように対応したセルの計算式も加えます。
- あと「5.タイムトラッキングの内容説明⑥」にある Get file from Shortcuts at path timesheet.numbers は、Error if Not found を ON に変更しておいたほうが良いかもです。<BR>もしファイルが無いと、デフォルトのファイルを github からダウンロードしてしまうからです。

**割り込み作業が発生した場合の動作についての説明**

1.「調査」「120」をセット

調査を開始しようと、「調査」「120」分をセットしたとします。その時 numbers には以下のように記録されています。
![IMG_3699.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/a49995f3-5575-7e14-a08d-eae23bdb74b1.jpeg)

2. 割り込みがあり「ミーティング」「３０」をセット

その後、120 分経過するまえに割り込みの案件があり、ミーティングに参加することとなりました。そこで「ミーティング」「30」をセットしました。すると、下記のように、"割り込み” としてマイナスの時間が追加されたのち、新しくミーティングの記録が行われます。<BR>このようにマイナスの値を加える事で、割り込みがあった場合の時間を補正しています。
![IMG_3700.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/3dddad8a-d0bb-a21b-43f2-67b868adadf1.jpeg)

**無音タイマーがおすすめ**

iPhone のタイマーに無音がありません。頻繁にタイマーの音が鳴るので私は無音音源をタイマーに加えて、バイブレーションみでの通知にしました。
無音タイマーの設定については、この記事では記載していませんので、下記の記事などを参考にしてみてください。
https://togai.jp/2021/04/24/1198


##5. タイムトラッキングの内容説明

|番号|画像|説明|
|---|---|---|
|①|!![IMG_3717.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/c6656e98-9339-da31-fc83-44c5ff248dd2.png)|・このアプリの説明|
|②|![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/f4e1d8e6-e50c-65fe-e055-d8a292a1237a.png)|・Dictionary 使い、選択できる項目リスト<BR>|
|③|![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/bc64614d-5155-c218-8561-c21603f2a82f.png)|・選択された項目のキーを Select にセット<BR>・キー(Select) に対応する値を取得し Chosen item にセット<BR>・費やす時間の質問し、Activity Minites にセット<BR>|
|④|![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/b1b9e3c1-dc47-835a-4009-f2842c012ada.png)|・コメントを質問し、値を Comments にセット<BR>・現在時刻の取得し "Start" にセット<BR>・現在時刻をフォーマットしFormatted start にセット<BR>※Date Format = ISO8601、include ISO 8601 Time とする。<BR>フォーマットしないと時間の比較が正しく動作しないため|
|⑤|![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/b247ab6c-a351-0e9b-e2be-449f55f39f36.png)|・Start-long 変数へ Formatted start をセット<BR>・辞書の start に、Formatted start をセット<BR>・辞書の select に、"Chosen item" をセット|
|⑥|![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/82a11859-1ba6-33a9-2250-5604fb304f8b.png)|・辞書の activity に "Activity Minutes" をセット<BR>・iCloud 上の /Shortcuts/timesheet.numbers をオープン|
|⑦|![oct31a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/baabde28-190c-3e40-ab9d-aba985001445.png)|・もし timesheet.numbers ファイルがなければ<BR> http://github.com/takimai39/timesheet/raw/main/timesheet.number をダウンロード<BR>・そのデータを timesheet.numbers として保存|
|⑧|![Oct31b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/974643d8-c9c7-d00f-d3d9-81eda0015efe.png)|・ダウンロードした旨のメッセージを表示<BR>・そして終了<BR>・latest.json ファイルを取得|
|⑨|![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/6ac9d964-3c90-d41f-2f37-20a7b4edea44.png)|・if ( latest.json != null ) { という意味合いの if 文<BR>つまりファイルが存在すればという意味の条件<BR>・latest.json を辞書として読み込み<BR>・辞書ファイルから start の値を取得｜
|⑩|![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/22461d29-e7da-d739-c6d9-b3fe9612f296.png)|・辞書ファイルから activity を取得<BR>・latest-start をフォーマット<BR>※Date Format = ISO8601、include ISO 8601 Time|
|⑪|![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/3a16ef8d-f423-fec1-19ab-1c7d3391a738.png)|・Latest-long 変数に "Formatted latest" をセット<BR>・Latest-long と Start-long の時間差を計算し、"Time Between Dates" にセット<BR>・Diff 変数に "Time Between Dates" をセット|
|⑫|![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/a7eaadb7-638b-1ae5-03f3-d731ae23afb1.png)|・if文：もし diff が、先の Activity (Latest-activity) より小さければ<BR>・先の activity の残残り時間をマイナス値として取得|
|⑬|![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/dc45e726-9baf-4657-77b2-6f34e9f10c07.png)|・timesheet.numbers に"割り込み” として、マイナスの時間を追加<BR>・連続して書き込みを実行すると失敗する対策で５秒待ち<BR>・if文終わり<BR>・if文終わり|
|⑭|![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/80ddba74-8627-9a2c-5871-6011a0120a04.png)|・lastest.json に辞書を保存<BR>・timesheet.numbers に、現在時刻、選択項目、コメントを追加|
|⑮|![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/7aadd0b1-549c-d4c6-b1cb-8441bd1184fb.png)|・指定時間のタイマーをセット<BR>以上






##6. numbers シートの説明

|番号|画像|ShortCuts での入力|
|---|---|---|
|①|![IMG_3725.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/a387c89c-2e98-fcbb-0dbd-1514940603c0.png)|・青線で囲われたセルは、対応する種類の時間を集計しています。<|
|②|![IMG_3726.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/f7f67ac3-c755-8cfd-5453-ceb621f6fcb5.png)|・青線で囲われた列は、分を元に時間にしています。|
|③|![IMG_3727.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/8fc78542-5ab3-bea5-34ad-9cc01ab363fd.png)|・円グラフは、時間列から表示しています。|

##7. その他

以下を参考にして作成しました
- Shortcuts アプリ -> ギャラリー -> Time Tracking を元にしました。
- numbers のグラフは、どこだったか忘れましたが numbers の TimeSheet のサンプルから。

以上、何かの参考になりましたら幸いです。


































|
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/f84a8b2b-04b2-850d-20a0-9ac8029bccbe.png)