
目次
外部のデータをNotionに流し込む仕組みを作ったことがあるでしょうか。スプレッドシートの内容を毎朝同期する、フォームの回答をデータベースに貯める、他のツールの案件情報を持ってくる。よくある使い方です。
動かしてみると、最初はうまくいきます。行が増えて、値も入る。問題ないように見えます。
数週間たったころに気づきます。セレクトの選択肢が、いつのまにか何十個にも増えている。しかも、よく見ると同じ意味のものが並んでいる。
なぜそうなるのかを、実際に値を投げて確かめました。
登録していない値が、そのまま通る
原因はこれです。
エラーにならず、選択肢が増える
セレクトの列に、登録していない値を書き込んでみました。想定としては、そんな選択肢はない、と断られるはずです。
通りました。エラーも警告もなく、その値が新しい選択肢として追加されます。色も自動で割り当てられます。
マルチセレクトでも同じでした。2つとも未登録の値でしたが、両方とも選択肢として登録されています。
親切な仕様ではあります
これ自体は、使いやすさのための作りだと思います。手で入力するときは、選択肢にない値を打てばその場で追加されますし、それと同じ動きです。
困るのは、人ではなく機械が値を送っているときです。機械は、間違った値も同じ調子で送り続けます。止まらないので、気づくのが遅れます。
末尾の空白1つで、別の選択肢になる
どこまで厳密に区別されるのかを試しました。ここが今回いちばん伝えたいところです。
4回書いて、3種類できた
「完了」「完了(末尾に半角スペース)」「完了」「Done」の順に書き込みました。人間の目には、3つ目までは同じものです。
| 書き込んだ値 | 結果 |
|---|---|
| 完了 | 新しく追加 |
| 完了␣(末尾に空白) | 別の選択肢として追加 |
| 完了 | 1つ目と同じものに一致 |
| Done | 新しく追加 |
見た目では区別がつきません。データベースの画面で見ても、同じ「完了」が2つ並んでいるようにしか見えないはずです。
元データの揺れが、そのまま溜まる
外部のデータには、たいてい揺れがあります。手入力された列なら特にそうです。末尾の空白、全角と半角、カタカナと英字。
Notionはそれを正規化しません。送られてきたとおりに、別々の選択肢として登録します。
結果として、集計が合わなくなります。「完了」で絞り込んでも、空白つきの行は拾われません。件数が微妙に足りない、という形で現れます。
上限100個に、早く到達する
もう1つの影響がこれです。前に測ったとおり、セレクトの選択肢は100個が上限でした。
本来10種類しかないはずのものが、揺れで30種類になっていれば、上限までの距離が3分の1になります。しかも、増えた70個は誰も使っていない選択肢です。
上限に当たってから掃除するのは、かなり面倒です。どの行がどの選択肢を使っているかを調べて、付け替えて、それから消すことになります。
ステータスだけは断ってくれる
同じことをステータスの列でも試しました。結果が違いました。
登録していない値は、はっきり拒否される
ステータスに未登録の値を書こうとすると、エラーで止まります。そんな選択肢は存在しない、というメッセージが返ってきました。
セレクトは黙って追加し、ステータスは断る。同じ「決まった選択肢から選ぶ列」なのに、扱いが逆です。
これは使い分けの材料になります
種類が決まっていて、増えてほしくないものは、ステータスで持つほうが安全だということです。
案件の進行状況、承認の段階、対応の区分。こういったものは種類が固定されているので、勝手に増えると困ります。ステータスにしておけば、間違った値が来た時点で同期が止まります。
止まるのは不便に見えますが、気づけるぶん、黙って増え続けるよりずっといいと思います。
図にすると、こう分かれます
メールとURLも、形をチェックしていない
選択肢だけの話ではありませんでした。他の列も試しています。
「これはメールではない」が保存された
メールの列に、メールアドレスの形をしていない文字列を書き込みました。通りました。読み返すと、そのまま入っています。
URLの列も同じでした。「ただの文字列」を書いて、そのまま保存されています。電話番号の列に日本語を書いても通りました。
| 列の種類 | 形の合わない値を書いたら |
|---|---|
| メール | そのまま保存される |
| URL | そのまま保存される |
| 電話番号 | そのまま保存される |
| ファイルの外部URL | そのまま保存される |
列の種類は、見た目の話でしかない
つまり、メールの列を選んだからといって、中身がメールアドレスである保証はないということです。列の種類は、表示のされ方とリンクの張られ方を決めているだけだと考えたほうが安全です。
外部データを入れる側で確かめるしかありません。Notionに渡す前に、形が合っているかを見る。合っていないものは、渡さずに別に記録しておく。
これをやっていないと、リンクを押しても何も起きない行が静かに増えていきます。
逆に、止めてくれる型もある
全部が素通りではありませんでした。止めてくれるものもあります。
日付・ユーザー・数値は確かめられる
| 列の種類 | 合わない値を書いたら |
|---|---|
| 日付 | エラー。決まった書き方の日付でないと通らない |
| ユーザー | エラー。実在しない相手を指定すると見つからないと返る |
| 数値 | エラー。文字列として送ると弾かれる |
この3つは、値の形が決まっているものです。日付は書き方が決まっていますし、ユーザーは実在するかどうかを確かめられます。数値も文字列と区別がつきます。
境目はどこにあるのか
並べてみると、規則がありました。Notion自身が正しさを判定できるものだけ、止めてくれます。
メールアドレスや電話番号は、形が合っていても実在するとは限りません。判定しきれないので、受け取るだけ受け取る。そういう作りになっているのだと思います。
この境目を覚えておくと、どこを自分で確かめるべきかがはっきりします。形の決まっていないものは、全部こちらの責任です。
書き込めない列が7つある
もう1つ、同期を作るときに当たるところです。
読み取り専用の列
値を書き込める列の種類は20でした。この一覧に入っていないものが7つあります。
- 作成日時
- 最終更新日時
- 作成者
- 最終更新者
- 数式
- ロールアップ
- ID(自動採番)
どれもNotionが自動で埋める列なので、外から書けないのは当然です。数式とロールアップは計算結果ですし、作成日時も勝手に決まります。
エラーが分かりにくい
ここで1つ、つまずきやすい点があります。これらの列に書こうとすると、「読み取り専用です」とは返ってきません。
代わりに、書き込める種類がずらっと並んだエラーが返ります。指定した種類が一覧にない、という形です。
だから、元の記録から移行するときに困ります。前のツールの作成日時をそのまま入れたい、というのはよくある要望ですが、作成日時の列には入りません。日付の列を別に作って、そこに入れることになります。
同期を作るときの順番
ここまでを踏まえて、実際にどう組むかを整理します。
1. 渡す前に、値をそろえる
いちばん効くのがこれです。Notionに渡す直前に、文字列の前後の空白を取る。全角と半角をどちらかに寄せる。
数行の処理ですが、これだけで選択肢が増え続ける問題のほとんどが消えます。あとから掃除するより、はるかに安いです。
同期を作るときに最初から入れておくのがおすすめです。後から足すのは、既に溜まった選択肢の処理も一緒にやることになります。
2. 増えてほしくない列は、ステータスにする
種類が決まっているものは、セレクトではなくステータスで持ちます。未登録の値が来たら止まるので、その場で気づけます。
ただし、止まるということは同期が失敗するということです。失敗したときに気づける形にしておく必要があります。エラーをどこかに記録するなり、通知するなり。黙って失敗していると、今度はデータが入っていないことに気づけません。
3. 増え続けるものは、そもそもセレクトにしない
取引先の名前、商品の名前、担当者の名前。こういう「これからも増えるもの」は、セレクトで持つと上限に当たります。
別のデータベースを作って、リレーションでつなぐ。これで件数の上限がなくなりますし、それぞれに情報を持たせられるようになります。上限の記事でも同じ結論になりました。
4. メールとURLは、渡す側で確かめる
Notionが見てくれないので、こちらで見ます。形が合わないものは渡さず、別に記録しておく。
ここで大事なのが、合わないものを黙って捨てないことです。捨てると、元データ側が間違っていることに誰も気づきません。記録しておけば、あとから直せます。
5. 自動で埋まる列は、渡さない
作成日時や作成者を送ろうとすると、分かりにくいエラーで止まります。最初から送らない作りにしておきます。
前のツールの日時を残したいなら、日付の列を別に用意します。「取り込み元の作成日」のような名前にしておくと、後から見たときに混乱しません。
よくある質問(FAQ)
増えてしまった選択肢は、まとめて消せますか。
消す前に、その選択肢を使っている行を付け替える必要があります。行の付け替えは外からまとめてできるので、正しい値に寄せてから、使われなくなった選択肢を消す順番になります。行を残したまま選択肢だけ消すと、その列が空になります。
セレクトの選択肢が増えないようにする設定はありますか。
そういう設定は見つかりませんでした。増えてほしくないなら、ステータスの列にするのが確実です。未登録の値が来た時点でエラーになります。
「完了」と「完了␣」のどちらが正しいか、画面で見分けられますか。
見た目では分かりません。選択肢の一覧に同じ名前が2つ並んでいたら、どちらかに余計な空白が入っていると考えていいと思います。外から一覧を取得すれば、文字列として比べられます。
メールの列に変な値が入っているかを、まとめて調べられますか。
調べられます。行を全部取得して、メールの列の中身を手元で確かめる形になります。Notion側に絞り込みの条件として「形が正しいもの」はないので、取ってきてから判定することになります。
数式の列に値を入れたいのですが、方法はありますか。
ありません。数式は計算結果なので、外から書き込む手段がありませんでした。決まった値を入れたいなら、数式ではなく普通の列にします。
前のツールの作成日時を引き継ぎたいです。
作成日時の列には入りません。日付の列を別に作って、そこに入れることになります。Notion側の作成日時は、取り込んだ日になります。
どこまでを渡す側で確かめるべきですか。
日付・ユーザー・数値はNotionが確かめてくれます。それ以外、特にメール・URL・電話番号・セレクトの値は、渡す側で見るものと考えておくのが安全です。
選択肢の一覧を、一度開いてみてください
同期を回しているデータベースのセレクト列を開いて、同じ名前が2つ並んでいないかを見てみてください。並んでいたら、どちらかに空白が入っています。早めに気づくほど、直すのが楽です。