AppSheetの「Are updates allowed?」で「This formula is not evaluated in the context of a row…」エラーが出た時の対処法

AppSheetアプリを開発していると、特定の権限設定で予期せぬエラーメッセージに遭遇することがあります。

今回は、Table Settings 内の Are updates allowed? という項目で「This formula is not evaluated in the context of a row, so column values are not available.」というエラーが表示された場合の、その意味と解決策について解説します。

何があったのか?

あるAppSheetアプリを作っていて、よくある「ログインユーザーが自分のデータだけを編集できるようにしたい」ということを実現する過程で起きました。

元々は、AppSheetアプリの開発初心者が引っかかったところなのですが、Webで検索をしていて

Table Settings 内の Are updates allowed? という項目を設定するとできる

ということを見つけたことが始まりでした。

そこで、Are updates allowed? に以下のような式を設定したところ、メッセージが表示されたということです。

SWITCH(USEREMAIL(), 
[メールアドレス], "ALL_CHANGES", 
"test@sample.com", "ALL_CHANGES", 
"READ_ONLY")

エラーメッセージの意味は?

まず、このエラーメッセージが何を意味しているのかを理解しましょう。

  • 「This formula is not evaluated in the context of a row」: この式は「行のコンテキスト(文脈)」で評価されません。つまり、AppSheetがアプリ内の個々のデータ行を処理している最中に、その行の特定のデータ(列の値など)にアクセスして評価する場所ではない、ということです。
  • 「so column values are not available」: そのため、列の値は利用できません。

なぜこのエラーが表示されるのか?

このエラーは、Are updates allowed? の設定箇所で、特定の行の列の値を参照しようとしたときに発生します。

Are updates allowed? は、その名の通り「テーブル全体の更新を許可するかどうか」を設定する項目です。AppSheetは、この設定を評価する時点では、まだ特定のデータ行にフォーカスしていません。テーブル全体が更新可能かどうかを判断するために、個々の行のデータにアクセスするに評価される必要があるからです。

今回、設定しようとした式 SWITCH(USEREMAIL(), [メールアドレス], "ALL_CHANGES", "test@sample.com", "ALL_CHANGES", "READ_ONLY") の中の [メールアドレス] の部分が問題でした。
これはスプレッドシートの「メールアドレス」というの値を参照しようとしていますが、前述の理由により、Are updates allowed? が評価される段階では、どの行の「メールアドレス」列を参照すればよいのかAppSheetには判断できません。

解決策:行のコンテキストに依存しない式を使う

Are updates allowed? では、テーブル全体の更新許可を設定するため、特定の行の列の値に依存する式ではなく、ユーザーのプロパティや固定値に基づく式を使用する必要があります。

今回のケースで最も適切と思われる解決策は、[メールアドレス] の部分を、特定のメールアドレスに置き換えることです。

例:特定のメールアドレスを直接指定する

特定の管理者ユーザーのみがテーブルを更新できるようにしたい場合、以下のようにメールアドレスを直接記述します。

SWITCH(USEREMAIL(),  
  "admin@example.com", "ALL_CHANGES",  
  "another_admin@example.com", "ALL_CHANGES",  
  "test@sample.com", "ALL_CHANGES",
  "READ_ONLY"
)

この式では、USEREMAIL() 関数で現在アプリを使用しているユーザーのメールアドレスを取得し、それが指定されたメールアドレスのいずれかと一致すれば ALL_CHANGES(全ての変更を許可)、そうでなければ READ_ONLY(読み取り専用)とします。これで、[メールアドレス] のような列参照がないため、エラーは解消されるはずです。

まとめ

AppSheetのTable SettingsにあるAre updates allowed?は、テーブル全体の更新権限を設定する場所であり、個々の行のデータにアクセスする前の段階で評価されます。そのため、この設定で特定の列の値を参照しようとすると「This formula is not evaluated in the context of a row...」というエラーが発生します。

解決策としては、USEREMAIL()などのユーザー情報関数や固定値を使って、行のコンテキストに依存しない式を使用するようにしましょう。


AppSheetでの開発は、このようにエラーメッセージの意味を理解することで、ぐっとスムーズになります。ぜひ今回の内容を今後のアプリ開発に役立ててください。