Google Spreadsheet をパスワード保護するアレ

株式会社オズビジョンのユッコ (@terra_yucco) です。
Excel ではなく Spreadsheet を使うことも増えてきましたが、G Suite などでしっかりアクセス制限されている業務ならともかく、サークル活動などで個人情報をやりとりしているケースを Spreadsheet に移すのはなかなかハードルが高いと感じています。

今回は【スプレッドシート パスワード】などと入力するとヒットする「Google Spreadsheet を暗号化する」方法を調べてみたので個人用のメモとして残しています。

# TL;DR

Excel でよくやるような読み取り専用パスワードをかけるものではなく、パスワードを使ってシート内の文字列を暗号化/復号できる仕組み。

【重要】日本語は暗号化してくれない

## テンプレート

あちこちの情報サイトに取り上げられている以下のテンプレートのコピーリンク。
スプレッドシートの URL に copy を付けて複製をさせるための URL なので `/copy` を削れば内容をコピー前に参照できます。

### コピー用 URL

https://docs.google.com/spreadsheets/d/1SMtKgPquJQ6E0zwzB-7yi3uiATgW1dyh5CaKwHwoRQc/copy

### 本体

https://docs.google.com/spreadsheets/d/1SMtKgPquJQ6E0zwzB-7yi3uiATgW1dyh5CaKwHwoRQc

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/f538ef44-0c74-9ea2-5062-a7615a14a61e.png)

ReadOnly に設定されており、スクリプトエディタも開けないので、この時点では中身はわかりません。
チュートリアルへのリンクが貼ってあります。


## 使い方
### チュートリアル

- [How to Password Protect a Document in Google Drive.](http://skipser.com/502)

### 実際の手順 (ほぼ上記の訳)

1. [ProtectedSheet](https://docs.google.com/spreadsheet/ccc?key=0Aize8AsQfYPJdGstX2toS3JzLXJFNEQ2VC1xaUE0enc&newcopy=true) Google スプレッドシートを開いてコピーを作成する。好きな名前にリネームして OK。<br>※コピーすると、コピーしたアカウントの My Drive 直下にファイルができる
2. ツール > スクリプトエディタ を選択する。(新しい窓かタブが開く)
3. 新しく開いたスクリプトエディタで ファイル > 版を管理 を選び【新しいバージョンを保存】。欄は全て空でも保存できる。バージョン 1 の行が表示されたら【OK】を押す。[^1]
4. 公開 > ウェブアプリケーションとして導入 を選び【更新】ボタンを押す。<br>※承認を求められるので【許可を確認】<br>※許可するスコープがめっちゃ広いので覚悟は必要かも[^2]
5. ウェブアプリケーションとしてデプロイされた URL が確認できる。[^3]
6. スクリプトエディタのウィンドウは閉じて、スプレッドシートに戻る。メニューから Protect File > Initialize する。
7. これで、データを安全にドキュメントに保存できるようになる。ただ、最初の 2 つの色付きの行はそのまま残すこと。
8. ファイルを暗号化するには Protect File > Encrypt File。
9. 復号するには Protect File > Decrypt File.

[^1]: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/75cc3c77-b5a8-2310-deab-98a642215138.png)

[^2]: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/af3d2ad4-f107-a366-8b9c-b7aa9d2455ee.png)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/98a8cc81-1e1a-27ad-1989-0730f048f6f2.png)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/1c4f9009-9508-ef4b-a9e2-379ff5d9ce9d.png)

[^3]: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/c91cfceb-a068-2611-542f-0eecfc298d4a.png)

## 暗号化の例
### before

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/0801b090-9a27-c430-108d-de23536a0614.png)

### after

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/44ddf20f-42cf-af96-9102-57094d26b44f.png)

### 気になること

#### 日本語が対象外
目の前でずらずらと暗号化/復号されるのは楽しいのですが、日本語が含まれるとそこで処理が止まってしまう模様。

#### パスワード変えても生成される暗号化文字列は同じ
パスワードが一致しなければ復号はできませんが、違うパスワードでも同じ暗号化文になりそうなので、強度には疑問が残るところ。

#### シート自体の暗号化ではなく、内容を任意に暗号化/復号できるもの
なので、誰かが復号した状態で他の誰かが開いたら、復号されたものを読むことが可能。
URL だけはある程度の範囲に公開されるものの、パスワードを知っている人にだけ中身を見せたいようなケースには不向き。

### 暗号化どうなってるの？

本体の Code.gs に処理が書かれていますが、

```js:Code.gs_(L.313)
a=text.charCodeAt(j);
```

として文字を取得しているけれど、そのあとで

```js:Code.gs_(L.320)
if(  !(a >= 123 || a < 31)) {
```

として文字の範囲を判定しているので、日本語をはじめとした文字が対象外になるのだと思われます。

いつか修正できないかやってみたいところ。

## Conclusion

「スプレッドシートを暗号化できる」と書かれると期待してしまうのですが、ちょっとサークルレベルの個人情報を置くにも心許ない印象を受けました。
やはり、Google の機能を活用するには Google アカウントを取得し、アカウント単位できちんと権限を管理していくことが必要なのかと改めて思わされました。