見出し画像

ヤーズフレックスの服薬管理アプリが使いにくいのでGoogleカレンダーで予定管理できるようにした

ヤーズフレックスのための服薬管理アプリ、なくないですか〜?
当方ピル歴6年くらいになるので、飲み忘れ通知とかはどうでもいい。
しかしapp storeは揃いも揃って服薬リマインド+体調管理ばかり…

そこで、GoogleスプレッドシートとGoogleカレンダーをGASで連動させることで、簡易的なものではありますが、生理日予定をPCでシミュレーションし、スマホで確認できるようにしました。

わたしは基本情報技術者を先日やっととったばかりの大学生です。Excel関数は少しできるけどプログラムとかほぼ書いたことないです。
あまりプログラミングに詳しくなくても、ExcelやGoogleスプレッドシートがある程度使えてググるスキルがあればなんとか実装できるように説明を丁寧めに書きました。

ほしい機能

  1. 半年先ぐらいの生理予定を確認しながら、いつ生理を起こすか決めたい(最重要)

  2. 過去の生理記録を一覧で見られるようにしたい

  3. スマホから簡単に確認できるようにしたい(重要)

1.半年先ぐらいの生理予定を確認しながら、いつ生理を起こすか決めたい

最大120日ぐらい生理を止められるヤーズフレックスのおかげで、一応次の生理予定が2ヶ月先〜4ヶ月先ぐらいになるわけです。28日周期のときは月末!月初!とかだいたい決まるので覚えやすいが、50日周期とかになると次回や次次回の生理がいつくるのかよくわからなくなる。
さらに、せっかくなら120日とかなるべく長く生理を止めたいのですが、私の場合は50日を超えると急に来る可能性が否めません。絶対に生理に被ってほしくない用事を優先して、余裕をもって生理を起こすか、なるべく頑張って長く飲んで休みに生理をぶつけるか……など、半年先ぐらいのおおまかな予定を確認しながら服用スケジュールを決めたかったのですが、それが実現できるアプリが…!ない…!!
いちいちカレンダーをみながら「何週間後が○月○日で…その次の生理は○月○日ぐらいに来る感じか…」と数えるのがだるい。

2.過去の生理記録を一覧で見られるようにしたい

これはふつうにgoogleスプレッドシートなりExcelなりで管理できれば問題ないです。実装は簡単。

3.スマホから簡単に確認できるようにしたい

いろいろ頭を悩ませ決めた生理予定をいちいち手でカレンダーに登録するのはだるすぎた。スマホで簡単に確認できるようにしたい。

まずはスプレッドシートで自作する

値を入力すべきところだけ色をつけてみた

ある程度Excelが使える人ならこれは簡単だ。
のみはじめ・休薬開始日・出血開始日を入力し、服用錠剤数も記載する。
あとは
・のみはじめ=休薬開始日+4日
・休薬開始日=のみはじめ+服用錠剤数
・出血開始日=休薬開始日+お好みの日数
となるように式を書き、必要な日数分式を下にコピーすればOKだ。
(ちゃんと正しい日付になるかどうか、指折り数えてみよう。)

これをつくってしまえば、服用錠剤数を「50」とか「70」とか「100」とか入力することで、いつ生理がきて、どのようにずらせるかを簡単にシミュレーションできる。今回は「50」で起こして、次回は「70」まで頑張れるといいタイミングで生理がくるなあ、など、休暇の予定や大学の予定に合わせて薬を調整しやすくなる。

スマホで確認できるようにする

今回の重点はここです。
正直、スプレッドシートのスクリーンショットを撮ってスマホに保存しておけばおわり、なのだが、カメラロールに自分の生理予定が入っているのは(わたしは)なんとなく気分が悪い。
それに、先の予定を立てるときには、なるべくカレンダー表示にしてくれたほうが、わかりやすくてありがたい。

方法としては
・アプリを自作する
・LINEに通知が来るようにする
なども思いついたのだけれど、そこまで技術力がないので、ボツ。
今回はGAS(Google Apps Script)を使って、自動でGooleカレンダーに予定を登録することで、「PCで生理日シュミレーションを行い、その結果をスマホで簡単に確認できるようにする」という方法をとることにしました。

ちなみにわたしの技術力ですが、先日やっと基本情報技術者試験に合格したばかりです。午後試験は表計算(Excel)で受けました、、、。
これまでこれといったプログラムは書いたことがありません。

①予定を登録するスクリプト

ここでサンプルコードどん!コピーしてね!ってやれたら親切なんですけど、自信がないのでまとめて置くことは避けます。改変部分だけ解説するので、頑張ってください。
このwebサイトがとても解説が丁寧でわかりやすかったです。まずは一度目を通してみてください。

スプレッドシートイメージ(完成)

それでは、上記webサイトに掲載されているスクリプトを参考に、改変部分を解説していきます。

7行目 変数の定義

変数は

var sht, i, startdate, stopdate, period ,added;

と定義しました。

shtはsheetのこと(多分。)コードの10行目で使います。
iは変数です。スプレッドシートの3行目から8行目まで、順番に作業するi行を教えてくれるためのものです。
startdate , stopdate , period は薬の飲み始め、休薬開始日、出血開始日を記録するためのものです。
addedは、i行をgoogleカレンダーに転記し終わったらスプレッドシートに「登録完了」と記すために使います。
(意味がわからなければ読み飛ばしてOKです)

10行目 shtの定義

sht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("予測");

としました。これは「今つかってるスプレッドシートの「予測」っていうシートをみてね」という意味です(多分)。シートの名前はお好きなようにしてください。

13行目 iの範囲

for(i = 3; i <= 8; i++)

これは「iの値は3〜8まで。iは一つずつふやしてね。」の意味です。
本来ここは変えなくてもいい気がするのですが、なんかそのままだと9行目以降が空行なせいでエラーを吐くのでいじりました。

20〜50行目あたり 値を変数に格納する

//i行2列目の値(服用開始日)をstartdateへ格納 
startdate = sht.getRange(i, 2).getValue();

//i行3列目の値(休薬開始日)をstopdateへ格納 
stopdate = sht.getRange(i, 3).getValue();

//i行4列目の値(出血開始日)をperiodへ格納
period = sht.getRange(i, 4).getValue();
スプレッドシートのこの部分です。

先ほど、iは3から始まることにしたので、
startdate=B3(2021/10/09)
stopdate=C3(2021/11/30)
period=D3(2021/12/1)となるように指定しています。
なお、ここの日付が抜けているとエラーが出ます。

プログラムわかる人には当たり前のことですが、一応書くと、
googleカレンダーへの転記がおわって、iが4になったときは、
startdate=B4
stopdate=C4
period=D4となります。(意味がわからなければ読み飛ばしてOKです)

本家のプログラムよりはずっと簡単になりましたね。

62行目 登録するカレンダーを指定する

Cal = CalendarApp.getCalendarById('***google.com');//カレンダーIDを記入する

ここは個人情報が載るところですね。もしサンプルコードを公開するなら気をつけて。***にはカレンダーIDが入ります。カレンダーIDってなに?という人はこちら。

カレンダーIDでカレンダーを指定した理由は、非表示を可能にするためです。
生理日管理ということで、人にみられたくないこともあると思います。
そこで今回は、生理日表示専用のGoogleカレンダーをつくることで、見せたくない/見たくないときには隠せるようにしました。
このあたりについての解説は以下が参考になると思います。

65行目 予定をカレンダーに記録する

//指定のカレンダーIDへインベント登録
Cal.createAllDayEvent("のみはじめ",startdate);//createAllDayEvent(タイトル、日時)
Cal.createAllDayEvent("おやすみ",stopdate);//createAllDayEvent(タイトル、日時)
Cal.createAllDayEvent("💌",period);//createAllDayEvent(タイトル、日時)  

本家のプログラムは、予定登録は1行につき1件、かつ、時刻指定などがあるのですが、今回は1行につき3件の予定(のみはじめ、休薬開始日、出血開始日)を登録する必要があります。また、終日で予定を入れることにしました。
終日予定はcreateAllDayEventで入れられるようです。(こういうのは、「GAS 予定登録 終日」とかでググれば出るよ)

また、カレンダーに「出血開始日」とか書いてあるとなえるので、表記は
「のみはじめ」「おやすみ」「💌」にしています。こちらもお好みで変えてください。🍒もかわいいね。

おわり!!!
ちゃんと動きましたか…?あとはaddボタンにスクリプトを割り当てて、ボタンで動くようにしてみてね!!!

②予定を全削除するスクリプト

生理日シミュレーション→登録 という今回の機能上、シミュレーションをやり直したときには登録しておいた予定を全削除してもう一度登録しなおす必要があります。
予定を全削除するコードは、こちらを参考にしました。

こちらはあまりいじっていません。

2行目 カレンダーを指定する

var calendar = CalendarApp.getCalendarById('***google.com');

62行目と同様、カレンダーをIDで指定します。

3行目、4行目 日付を指定する

コードは省略しますが、日付を必要な日付に変更しましょう。

16行目 予定を記録するシートを指定する

SpreadsheetApp.getActiveSpreadsheet().getSheetByName("削除").getRange(2, 1, values.length, values[0].length).setValues(values);

本家のものはアクティブシートに記入するようになっているのですが、deleteボタンを「予測」シートに配置したことから、もしアクティブシートのままで実行すると生理日予測のシートがぐちゃぐちゃになるというわけです。そこで、ちゃんとシートをgetSheetByName("削除")で指定しています。
「削除」のシートは元記事を参照して同じようにつくってね。

18行目 functionを一つにまとめる

}
function deleteCalendarEvents(){

本家のコードにあるここの部分を削除します

本家は、予定をすべてシートに書き出す→消すものだけを選んで、削除を実行する という形になっており、操作を2段階で行っています。

しかし、今回はすべての予定を削除しないと二重に生理日予測が登録されてしまうので、正直1度deleteボタンを押せば削除まで実行してほしいです。
そこで、後半のfunction deleteCalendarEvents()を消し、一つの関数として実行されるようにしてしまいましょう。{}が全体でうまく対応していないとエラーになるので、よく見て消してくださいね。

19行目、20行目 カレンダーとスプレッドシートを指定する

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("削除");
var calendar = CalendarApp.getCalendarById('***.google.com');

2行目、16行目に合わせて、後半も記述を揃えます。

おわり!!!
こちらもdeleteボタンに割り当てて、実際に動くか確認してみてね。

使い方の注意

addを押す前にF列を空にする

プログラムを読める人にとっては当然のことなのですが、
「add」ボタンを押すときには、「予測」スプレッドシートのF列にある「登録完了」を消して、ピンクの色のセルを空にしてから動かすようにしてください。理由を書いておくと、①予定を登録するスクリプト の60行目ぐらいで、「もし6列目(F列)が空だったら、googleカレンダーに予定を登録してね」と書いているからです。F列に「登録完了」が入っていると、カレンダーに予定が登録されません。

ここ 消す

deleteを押す前に「削除」シートをきれいにする

同様にdeleteボタンを押す際にも、「削除」シートに余計な情報が入っていないか確認してから行ってください。理由は、後半で「「削除」っていうシートに入っている予定を消してね〜」と指示しているからです。余計なものが残っていると多分エラーになります。

「削除」シートはこうなってればOK

記録と予測は別々に保管する

自動でスプレッドシートに記入する機能がついているので、設定を事故ると「予測」シートが上書きされてしまう可能性があります。
そこで、記録は別のシートに保管しておきましょう。今回は「記録」シートをつくっています。

さいごに

だいたい6時間ぐらいでつくりました。
調べた感じでは同じ機能を作っている人がいなかったようなので、作成過程をまとめて公開することにしました。
実際に使ったら不都合も出てくるかもしれないので、順次改装予定です。
お役に立てば幸いです。

スマホから見るとこんな感じ おつかれ!

この記事が気に入ったらサポートをしてみませんか?