2️⃣

Formula 2.0 の変更点

1. フォーミュラエディタが改良され、執筆と編集が簡単になりました。

  1. 複数行編集可能な新しい拡張エディタになりました。
  1. エディタボックスで直接タイプチェックやハイライトができるようになりました。
  1. プロパティはこれまで prop("日付") のように記述していましたが、エディタ内での選択制になり図のように 日付 のように灰色背景で表示されるようになりました。
  1. キーボードの矢印キー(↑↓)はこのプロパティなどの選択を切り替える機能に割り当たっています。エディタ内で上下移動する場合には、Option/Alt キーを押しながら矢印キー(↑↓)を押してください。
notion imagenotion image

2. 大きな変更点

より多くのユースケースをフォーミュラでサポートするために、製品の改良が行われています。
  1. 数式がリストをサポートするようになりました。結果として以下の型が利用できるようになりました
    1. 内容
      対応するプロパティ
      Text
      テキスト
      Title, Text, Select, Email, URL, Phone number, ID
      Number
      数値
      Number, Rollup (Number)
      Date
      日付・日付範囲
      Date, Created Time, Last Edited Time, Rollup (Date)
      People
      Created by, Last Edited by
      Boolean
      true か false
      Checkbox
      Page
      ページ
      List (array)
      上のものの配列 (異なる型は同居できない)
      Multi-Select (List of Text), Person (List of People), Relation (List of Page), Rollup (List of any type)
  1. 式が改行したりインデントしたりできるようになりました。また、式中に /* コメント */ が記載できるようになりました。
  1. 数式がページ、ブロック、ピープルのリッチデータ出力に対応しました。
  1. 数式からリレーションの特定のプロパティにアクセスできるようになりました。ほとんどロールアップの必要性がなくなりました。
    1. 例: relation.map(currentValue.number_property).sum(): リレーション relation に登録されるているページ群を number_property の値に変換した上で合計します。
  1. People プロパティでワークスペースレベルの情報(電子メールとフルネーム)にアクセスできるようになりました。
  1. 関数がメソッド形式でも呼び出せるようになりました。メソッド形式の場合、関数の第一引数に対して呼び出す形になります。
    1. 例: unc(obj, arg1, arg2)obj.func(arg1, arg2)
      これによりこれまでのような括弧の対応を探す作業がなくなります。
      /* Formula 1.0 */ dateSubtract(dateSubtract(now(), hour(now()), "hours"), minute(now()), "minutes")
      /* Formula 2.0 */ now().dateSubtract(now().hour(), "hours") .dateSubtract(now().minute(), "minutes")

3. Formula 2.0 の関数一覧

Formula 2.0 の関数一覧は以下の通りです。ページ内に具体的な使い方も書いてあります。

4. Formula 1.0 との非互換部分

現在わかっている Formula 1.0 との非互換部分は以下のとおりです。ただし、多くのものは自動的に変換されます。
  1. プロパティは prop("プロパティ名") のように記述していましたが、リストからの選択制になりました。内部的にはプロパティ ID などが記録されていると思われます。テキストなどにコピーすると以前のように prop("プロパティ名") のように書き出され、逆にペーストするとプロパティが選択された状態になります(これはアンバサダーからの強い要望で入りました)。
  1. month 関数はこれまで 0-11 の値が返ってきましたが、わかりにくかったので Formula 2.0 では 1-12 の値が返ってくるようになりました。これまでのスクリプトは自動的に month(xxx) - 1 に書き変わります。
  1. day 関数も 0-6 の値が返ってきましたが、1-7 に変更になっています。こちらは日曜日が 0 から 7 に変更になっています。これまでのスクリプトは自動的に day(xxx) % 7 に置き換わります。
  1. slice 関数は文字列の部分文字列を取得する関数でしたが、Formula 2.0 ではリストの部分リストを取得する関数になりました。これまでの slice の機能は substring となります。これまで作成した Formula は自動的に substring に書き変わります。
  1. start 関数は dateStart 関数に変わりました。これまで作成した Formula は自動的に dateStart に書き変わります。
  1. end 関数は dateEnd 関数に変わりました。これまで作成した Formula は自動的に dateEnd に書き変わります。
  1. epi は定数ではなく関数になりました。e()pi() のように書く必要があります。これまで作成した Formula は自動的に e()pi() に書き変わります。
  1. join 関数がリストを受け付けるようになったため引数の順番が変更になりました(Python 型 → Ruby 型)。
    1. /* Before (Formula 1.0) */ join(", ", "abc", "def") /* 結果は "abc, def" */ /* After (Formula 2.0) */ join(["abc", "def"], ", ") /* 結果は "abc, def" */ ["abc", "def"].join(", ") /* 同じ結果、これだと Ruby と同じイメージ */

5. Formula 2.0 への自動コンバート

上記変換で変わるものをまとめてみました。当初、add, sub などの演算子のある関数は削除されていたのですが、アンバサダーの要望により後方互換性のために復活しました。Notion としては演算子の方に移行してほしいようで、変換は残ったままです。

6. Formula 2.0 で追加された関数

Formula 2.0 で追加された便利な関数は以下のとおりです。
  1. 📓
    parseDate
    : 文字列から日付を作成できます。これまで dateAdddateSubtract 関数で無理やり作成していた日付関係の作成系の小細工は必要なくなりました。
  1. 📓
    let
    ,
    📓
    lets
    : 計算した値を変数として一時保持できます。以下のフォーミュラは values で与えられた数値リストを並び替えて、最大値と最小値を取り除いたものを mid という変数に一時保存しています。その後、そのリストの合計と個数を計算して割り算することで、最大・最小を取り除いた平均 (オリンピックなどの採点競技などでよく使われる中央だけの平均値)を計算できます。
    1. let(mid, prop("values").sort().slice(1, -1), mid.sum()/mid.length())
  1. 📓
    ifs
    : Excel の中にある同名の関数と同じで複数の条件に対して対応する値を返します。
  1. 📓
    sort
    : リストを並び替えた新しいリストを返却します。
  1. 📓
    reverse
    : リストの順序を逆順にした新しいリストを返します。
  1. 📓
    unique
    : リストの重複項目を取り除いたユニークな値だけを持つリストを返します。
  1. 📓
    map
    : リストの各項目に対して、与えられた処理を実施した新しいリストを返します。
  1. 📓
    filter
    : リストの中から条件を満足するものだけを抽出したリストを返します。
  1. 📓
    find
    : filter と同様ですが最初の一つの要素を返します。
  1. 📓
    findIndex
    : filter と同様ですが最初の一つの要素の位置を返します。
  1. 📓
    first
    ,
    📓
    last
    : リストの最初と最後の要素を取り出します。
  1. 📓
    at
    : リストの指定した位置の値を返します。
  1. 📓
    every
    ,
    📓
    some
    : リストの全ての要素が true かどうか、いずれかの要素が true かどうかを返します。Ruby でいう all?any? に相当するものです。
  1. 📓
    repeat
    : 文字列を任意回数繰り返せるようになりました。以前よく使われていたプログレスバーは substring (旧 slice) を駆使していましたが、これを使うと簡単に記述できそうです。
  1. 📓
    week
    : ISO の月曜始まりの週数を返します。以前は toNumber(formatDate(prop("date"), "W")) のようにしていたものです。日曜始まりの場合は、これまで通り "w" を使って導出してください。
  1. 📓
    dateRange
    : 日付範囲を作成します。いよいよ Formula で終了時間が設定できるようになりました。
  1. 📓
    split
    : 文字列を区切り文字で区切ったリストを返します。
  1. 📓
    match
    : 文字列にマッチしたものがリストとして返ります。
  1. 📓
    upper
    ,
    📓
    lower
    : アルファベットを全て大文字・小文字に変換します。
  1. 📓
    style
    ,
    📓
    unstyle
    : 文字列の装飾を設定したり、解除したりします。
  1. 📓
    link
    : リンク文字列を設定できます。

7. Notion から提供されているオフィシャル情報