drive.file と複数の Google アカウント——「シートを表示できません」の本当の原因はアカウントの取り違えだった
Sheet Widget は、Google の drive.file という権限で、利用者が選んだスプレッドシートだけを読んでいます(この権限を選んだ理由)。
drive.file は、ほかのファイルが見えないぶん安心な権限ですが、複数の Google アカウントを持っている人では、思わぬ形でシートが読めなくなることがありました。
drive.file の許可は「アカウントごと・ファイルごと」
drive.file で許可されるのは、「どの Google アカウントで」「どのファイルを」選んだか、の組み合わせです。
- アカウント A でファイル X を選ぶ → アカウント A のログイン情報で、ファイル X を読める
- アカウント B のログイン情報では、同じファイル X は読めない(B では選んでいないので)
Sheet Widget では、ファイルを選ぶ画面(Google Picker)を、アプリ本体のログインとは別の、Web のログインで開いています(理由はこちらの記事)。この2つのログインはつながっていないので、アプリにはアカウント A でログインしているのに、Picker ではアカウント B を選んでしまう、ということが起こります。そうすると、選んだシートは、アプリが持っている A のログイン情報では読めません。
エラー文が、利用者を逆方向に案内していた
最初、シートを読めなかったときのウィジェットのエラー文は、「ファイルが削除されたか、名前が変わった可能性があります」という内容を主な原因として案内していました。
ところが、実際に読み込みに失敗したときの傾向を調べると、ほとんどがアカウントの取り違えでした。ファイルの削除や名前の変更は少数で、エラー文は利用者を見当違いの方向に案内していたことになります。
そこで、エラー文を次のように書き直しました。
- まず「別の Google アカウントで選んでいないか」を確認してもらう
- 「+」から、正しいアカウントでシートを選び直してもらう
ゴミ箱に移されたファイルは、Google Drive の API で別に判定して、その場合だけ専用のメッセージを出しています。
選んだときに気づけるようにした
エラー文を直すだけでなく、シートを選んだ時点で取り違えに気づけるようにもしました。
- Picker のページで、ファイルを選んだときに、そのときログインしていた Google アカウントのメールアドレスも取得して、アプリに返す
- アプリは、そのメールアドレスが、アプリに登録されているアカウントに含まれているかを確認する
- 含まれていない、かつ実際にシートの読み込みに失敗した場合だけ、「別のアカウントで選んだようです」という案内を表示する
「登録されていないアカウント」というだけで案内を出すと、問題なく読めている場合にも出てしまうことがあります。実際に読み込めなかったときだけに絞って、誤った警告を出さないようにしました。
案内のボタンは、プランによって分けています。
| プラン | 案内に出すボタン |
|---|---|
| Pro(複数アカウントに対応) | 「〈選んだアカウント〉を追加」。押すと、そのメールアドレスを候補にしてログインし、成功したらシートを読み直す |
| 無料(アカウントは1つ) | Pro の説明。無料版は、アカウント1つで使う前提のため |
無料版は、Picker にアカウントのヒントを渡す
無料版では、アプリに登録できる Google アカウントは1つだけです。そこで、Picker を開くときに、アプリでログインしているアカウントのメールアドレスをヒントとして渡し、最初からそのアカウントが選ばれるようにしています。これで、取り違え自体が起きにくくなりました。
Pro では、複数のアカウントを使い分ける前提なので、ヒントは渡さず、Picker の中でアカウントを選べる状態のままにしています。
まとめ
drive.fileの許可は「アカウント × ファイル」の組み合わせ- ファイル選択とアプリ本体のログインが別になっていると、アカウントの取り違えが起きる
- エラー文は、実際の失敗の傾向を確かめてから書く(思い込みで書くと、逆方向に案内してしまう)
- 選んだ時点のアカウントを確かめて、実際に失敗したときだけ案内する
- アカウントが1つの前提なら、Picker にヒントを渡して取り違えを防ぐ
Sheet Widget は App Store で公開しています。