Appsheetを利用して自分で、自分が必要としているアプリをノーコードで作成できる。とっても素晴らしいな、と思います。ノーコードで作成できる、といってもそれなりに設定が求められますが…。苦戦しつつも以下の要件定義をAppsheetを使って作成してみました。
【要件定義】
- 毎日必ずこなすべき日課を一覧にする。完了、未完了のステータスを簡単に管理できること。
- 毎朝起床すると、今日のやるべき事のタスク一覧が表示され、”Not yet”(まだ着手していない)の状態となっていること。
- タスクを完了すると、アイコンをクリックして”Done”にステータスを変更し、そのタスクは自動的にソートされる。同時にログとして記録される。
- 毎日所定の時刻になると、”Done”のステータスは自動的に”Not yet”に戻る。
- 日付も毎日更新する。(この機能はSpreadsheetに関数”=today()”を入れているため、Appsheetの機能を利用せずに毎日正しい日付を自動で取得する)。
- どのタスクに何分費やしたか、どんな内容のことを行ったを記録できるメモ欄もあるので、必要な時にはEdit画面から補足情報を記録する。
以上の繰り返し。
参考にさせていただいた記事は下記の通りです。これらの記事が無ければ今回のアプリは実現できませんでした。大変貴重な情報に感謝いたします。今後も自分でこうしたい、と思えるものを実現できるように今後も改良してゆきます。
Google Apps Script で毎日決まった時間にスクリプトを実行するトリガー設定 (tonari-it.com)
Google Apps Scriptで呼び出したトリガーを削除する方法 (tonari-it.com)
AppSheet で簡単に作る!自分だけのタスク管理アプリ | ヨシヅミ-吉積情報株式会社|Google 認定プレミアパートナー (yoshidumi.co.jp)
作成の手順
まずはGoogle Spreadsheetで必要な項目、内容を記載します。Date列には関数の”=today()”を入力します。
GoogleのSpreadsheetを利用してこのように。

シート1”Task”の一覧。

続いて記録を残すための別のシート、”Log”も作成します。

つづいてAppsheet → ”Create an app”と進みます。さらに進んでゆくと、下記の画面になるので、ここからいよいよカスタマイズの開始です。

まずはDataページの作成からスタートします。Appsheetのタイトルを”Daily task checklist”に変更し、Logシートも追加します。(虫眼鏡アイコンの右隣りになる”+”をクリック)

Table: Tasksは以下の設定に。

続いてTable:Logは以下の設定に。

次に”Actions”へ移ります。

設定の内容は下記の通り。まずは一つ目。完了したタスクを”Done”に移動するためのアクションを作成してゆきます。



もう一つ作ります。”Save log”。完了したタスクをLogページに保存するものです。



つづいて”Automation”へ。

こんな感じです。Log column [Status] is changedの内容は以下の通り。

Setting画面にてセットしてゆくと、Conditionの中身は自動的に入力されます。詳細を見ると以下のようになっています。

Save Logの内容は以下の通り。

保存すると、Save Log 2が発生し、以下の画面のようにエラーが生じていました。赤マルがある限り後続処理が進みません。プロセスに問題があるのか、エラーの原因は残念ながら理解できていません。強制的にSave Log 2を削除します。(削除の後、動作確認テストをする限り問題はないようです)


DeleteしてSaveします。続いて”View”を整えてゆきます。

まずは”Tasks”から。




続いて”Log”へ。



さて、ここで動作を確認してみます。以下の状態が初期状態です。

英語とロシア語を完了したのでチェックマークを押しました。すると、自動的に両者が”Done”に移動しました。

このアプリでデータベースとして利用するSpreadsheetに戻ってみると、当初はすべてのStatusが”Not yet”でしたが、データベース(Spreadsheet)を覗いてみると、きちんと”Done”に更新されています。

以下の通りLog sheetにもログが正しく残っています。(ここでは詳細の説明を省いていますが、どれだけ時間を費やしたか、備忘録を残しておきたい時にはステータスを”Done”にする前に編集画面から記録を残してSaveすることもできます)

そして、明日も再び同じタスクを繰り返すことになりますが、ここで設定したいのは今日から明日の日付に変わった後に以下の二つが保証されることです。
- Statusが”Not yet”に戻ること、
- Time spentとMemoに記録した今日の内容がクリアされていることです。
それを実現するために、GASを利用しています。Apps Scriptを開き、Edit画面へ。


以下のコードを書きます。1:00にこのコードが走るように設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
function myFunction() { const functionName = 'targetFunction'; deleteTriggers(functionName); const date = new Date(); const time = '1:00'; date.setHours(...time.split(':')); setTrigger(functionName, date); } function deleteTriggers(functionName) { const triggers = ScriptApp.getProjectTriggers(); triggers.forEach(trigger => { if (trigger.getHandlerFunction() !== functionName) return; ScriptApp.deleteTrigger(trigger); }); } function setTrigger(functionName, date) { ScriptApp.newTrigger(functionName). timeBased(). at(date). create(); } function targetFunction() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getActiveSheet(); var range = sheet.getRange(2,3,6).setValue("Not yet") var range = sheet.getRange(2,5,6,2).clearContent() } |
最後の二行にある数値では、
#上から2行目、左から3列目のセルを起点に6個下のセルまでを指定し、Valueを”Not yet”にします。
#上から2行目、左から5列目のセルを起点に6個下のセルまで、かつ隣のF列も含めるため列数を2としています。この範囲のセルをすべて空欄にするものです。例えば、今日のタスク実行で、タスクに要した時間やメモ書きを行った場合には、このコードがクリアしてくれます。そして明日は再び空欄の状態からタスクを開始できます。
この内容をSaveして実行すると…以下の警告メッセージが表示されます。このままAdvancedをクリックすると警告メッセージが表示されました。


”Advanced”をクリックし…”

さらにGo to Recet Status to Not yet(unsafe)”をクリックすると…

無事にコードが走りました。Triggerの場面にゆくと、以下のように新しいTriggerが作成されていることが分かります。

右側に見える鉛筆マークをクリックすると下記の画面になります。GASに記述したコードを自動的に実行させるために必要となるトリガーです。ここでは、毎日24時~25時の間に関数targetFunctionが自動的に実行されるように、という指示を表しています。

さて、実際の結果がどうなっているかを翌日に確認してみました。無事にTriggerが予定通りに実行されたことが記録されています。

昨日にStatusを”Done”にしていたものも、朝にアプリを開くと以下のように”Not yet”のステータスに戻っています。

Logシートにもしっかりと記録が残されています。

まだ改良の途上ですが、どのタスクを継続して毎日実行できているか、何分ほどタスクに時間を費やすことができているかなどをグラフで可視化することもできそうです。いざ自分で作り出そうとすると、この機能も欲しい、あの機能も…ときりがありませんし、いざ設定しようとすると上手くゆかずに時間だけが経過してしまうことも。まずは小さく始めて実際に動かしてみる。それから徐々に機能を追加していったり。その積み重ねが次につながる大きな一歩となるはずです。