スプレッドシートでアカウント毎の表示管理がしにくい

スプレッドシートでアカウント毎の表示管理がしにくい

解決方法の発見と技術の進歩を祈りつつ
愚痴を話すだけの内容となります。

起承転結の「起」

特に困っているわけではありません。
スプレッドシートを誉めまくる記事を書こうと思い調べていたら、
少し不便に感じる部分があり様々調べたので、
せっかくなのでまとめておこうという話です。

内容としては、
「スプレッドシートでアカウント毎の表示管理がしにくい」
パスワードをかけて表示させないようにしたり、
アカウントによってシートやセルの一部を隠したり、
そういった表示内容の切り替えがしにくいという意味合いです。

起承転結の「承」

まずはデフォルトで設定できる内容をまとめます。

・アカウントやリンクによる閲覧制限
共有したアカウントのみが内容を閲覧できたり、
そのスプレッドシートのリンクを知っている人のみが内容を閲覧できたりを設定できます。
ファイル単位であれば管理はしやすいようです。

・シート/セル単位での編集制限(保護)
編集が可能なアカウントをシートやセル単位で設定できます。
ただし編集不可アカウントでも閲覧は可能です。

・保護されたシートの非表示
保護されていなくてもシートの非表示は可能ですが、
保護されたシートを非表示にすると
編集不可アカウントがそのシートを表示できなくなります。
ただし、非表示シートの存在は確認することができる上に、
非表示シート内のセルの値を参照することはできてしまいます。
(「=非表示シート!A1」のように)
また、編集可能アカウントがシートの内容を見ようとすると
非表示を解除するしかなくリアルタイムで全アカウントが閲覧可能になります。

まとめると、共有したら最後ファイルの全てが閲覧可能となります。
デフォルトの設定では閲覧内容の細かい設定はできません。

起承転結の「転」

一応、アカウント毎の表示内容を細かく切り替える方法は(恐らく)あります。
望む内容を表示させるマクロを組むという方法です。
ただし、現実的かどうかはとても怪しいです。
「結」まで読み飛ばしても構わないくらい怪しいです。

スプレッドシートのマクロは
GAS(Google Apps Script)というプログラミング言語を用いて作成します。
スプレッドシートを開いたアカウントのIDを取得することができるため、
取得したIDによって表示内容を変えると良いのです。

しかし、表示させたくない内容が同じスプレッドシート内にあると
前述のセル参照ができてしまう問題が発生してしまいます。
ではそれぞれの表示内容を別のスプレッドシートに保存しておいて、
そこからアカウントIDに対応する内容を取得するのはどうでしょうか?
実はまだ抜け穴はあり、「importrange」という便利で凶悪な関数によって
アクセス権がある状態ならID対応外の内容まで確認できてしまいます。
この条件は別スプレッドシートの内容を取得するための条件でもあるので、
アクセス権があるスプレッドシートには表示内容を書いてはいけないことになります。
また、リンクも隠さなければ辿られてしまうので、
また別のスプレッドシートを工夫しつつ挟む必要も出てきます。
更に表示はどこでするか?新規のシートを作るか?うぐぐ……

こうして考えていくとWebアプリを作成した方が早くて安心という話になってしまいます。
上記の方法も編集方法については考慮できていないので、
苦労の先に使い物にならないシステムが完成する可能性が高いです。

起承転結の「結」

1つのスプレッドシート内で表示を切り替えるのは諦めて、
沢山のスプレッドシートを管理する方が楽で早いと感じました。
ただ、それぞれ設定して管理し続けるのはとても大変ですが。
元も子もありませんが、この記事では「諦めるべき」を結論とします。

最後に1点だけ。
「スプレッドシートは思っている以上に危険ではないか?」
攻撃的にも、防御的にも。
考えすぎかもしれませんが。

以上です。