ttmttko
    ttmttko

    Copyright ©︎ Takao Tatematsu. All Rights Reserved.

    X

    notionで進捗バー作った際、端数5%の処理につまずいた記録

    🗓 作成日
    2021/02/11
    更新日
    2021/03/27
    🔖 タグ
    notion

    notionで進捗バーを作る時にはまったので、記録しておきます。

    進捗バーの数が特定条件で増える問題

    例えば、 notion 進捗バー などでググってよく出てくる以下のformulaを試してみます。

    slice("●●●●●●●●●●", 0, round(prop("進捗率") * 10)) + slice("○○○○○○○○○○", 0, round((1 - prop("進捗率")) * 10)) + " " + format(round(prop("進捗率") * 100)) + "%"

    ※sliceの関数は、 slice("xxxxx", 【開始位置】, 【終了位置】) のかたちで抽出する値の開始位置から終了位置までの値を抜き出す関数です。 例えば、slice("1234567",0,3) だと、「123」という結果で、slice("1234567",2,4) だと「34」という結果になります。

    実行結果

    Untitled

    進捗率
    progress
    _
    0.09

    ●○○○○○○○○○ 9%

    0.24

    ●●○○○○○○○○ 24%

    0.31

    ●●●○○○○○○○ 31%

    0.55

    ●●●●●●○○○○○ 55%

    0.68

    ●●●●●●●○○○ 68%

    0.85

    ●●●●●●●●●○○ 85%

    結果をみるとわかるとおり、端数が5の時、進捗バーの記号1つが増えています。

    理由は、このformulaの場合、 進捗率の実数*10分の「●」の数を数えつつ、 1-進捗率の実数*10 の「○」の数をつないでいるため発生します。

    例えば、24%(0.24)の時、 0.24*10=2.4 で「●」は2個になり、 (1-0.24)*10=7.6 で「○」は8個になります。この時小数点以下は四捨五入されています。

    一方で、55%(0.55)の時、 0.55*10=5.5 で「●」は6個ですが、 (1-0.55)*10=4.5 で「○」は5個になります。その結果11個の記号を用いた進捗バーの表現になってしまいました。

    image

    この時の自分の思い出Tweet。

    解決方法

    このケースを考慮に入れた記述は次のformulaです。

    めっちゃ簡単な記述あったので修正しました

    slice("●●●●●●●●●●", 0, round(prop("進捗率") * 10)) + slice("○○○○○○○○○○", round(prop("進捗率") * 10))+ " " + format(round(prop("進捗率") * 100)) + "%"

    「○」については開始位置だけを指定する記述にすれば十分でした。

    例えば、55%の時、 0.55*10=5.5 で「●」は6個になります。 一方で「○」は 0.55*10=5.5 で6と計測されますが、開始位置だけを指定する記述 slice(text,number) にして、6番目の「○」以降を取得する(つまりは「○」は4個になる)ようにするだけで、十分でした。

    slice("●●●●●●●●●●", 0, round(prop("進捗率") * 10)) + slice("○○○○○○○○○○○", 1, 11 - round(prop("進捗率") * 10)) + " " + format(round(prop("進捗率") * 100)) + "%"

    中身は次のとおりです。

    「●」の数を 数えるのはこれまで通り。

    逆に「○」のときは、 【終了位置】を11-(進捗率*10) にして1つ数字を多く数えるように規定しつつ、「○」の【開始位置】を、0からではなく1からにすることで、余分に数えている数字の考慮を入れます。

    更に四捨五入の計算を先に持ってくることで、5の端数のケースの処理を適切に行なっています。

    例えば、55%の時、 0.55*10=5.5 で「●」は6個になりますが、 11-(round(0.55*10))=5 で、○の終了位置を5としつつ、開始位置を1に置くことで、「○」の数を4つとみなします。

    この作業によって、○の数が余分に考慮されるケースを除外できます。

    実行結果

    進捗率
    progress
    _
    0.09

    ●○○○○○○○○○ 9%

    0.24

    ●●○○○○○○○○ 24%

    0.31

    ●●●○○○○○○○ 31%

    0.55

    ●●●●●●○○○○ 55%

    0.68

    ●●●●●●●○○○ 68%

    0.85

    ●●●●●●●●●○ 85%

    もしよければ試してみてください。

    Appendix

    こんな記述方法もあります。最初はこちらも利用していましたが、この記事書いていたら、上記のシンプルな記述でも行けそうだということがわかりました。

    if(round(prop("進捗率") * 100) < 5, "○○○○○○○○○○", if(round(prop("進捗率") * 100) >= 95, "●●●●●●●●●●", slice("●●●●●●●●●●", 0, round(prop("進捗率") * 10)) + slice("○○○○○○○○○○", 1, 11 - round(prop("進捗率") * 10)))) + " " + format(round(prop("進捗率") * 100)) + "%"

    参考:

    Achieve Your Goals: OKRs in Notion ~ Notion VIP

    This guide details the development of this OKR template, which you can use for reference or duplicate within your own workspace. Notion's unique combination of features form a powerful platform for managing your goals. Not only can you organize your active goals; you can also maintain accountability and reference lessons learned from past goals.

    www.notion.vip

    Achieve Your Goals: OKRs in Notion ~ Notion VIP
    icon
    share this page

    Copyright ©︎ Takao Tatematsu. All Rights Reserved. This website is made with 🄽 Notion and ⚡️ Super