安全性の高いエントリーシートの作成方法

# はじめに
クイズの発展にはインターネットが欠かせない。現状も他の競技に比べインターネットを活用している。しかし、インターネットという全世界とつながっている媒体を使用しているにも拘わらず、個人情報の管理の徹底がなっていないことが多く見受けられる。
これからクイズが一般的な競技になっていくことを願って、私は今回個人情報の守れるエントリーシートの作り方を記そうと思う。
#やってはいけないこと
**1. Googleフォームで自動生成されるスプレッドシートの公開**
これが一番よく見る大間違いだ。スプレッドシートの非表示機能を使えばぱっと見は隠せているように見える。しかし、シートをダウンロードすることで簡単に再表示することができてしまうのだ。

**2. importrange関数を用いて別シートに引用**
これは①がよくないと分かる、ちょっとインターネットに強い人がやりがちなミス。これで完璧に隠すことはできなくはないが、元ファイルの共有が少し難しくなる。なぜなら、importrange関数の式には元ファイルのキーが入っているからだ。これをネットに打つと、共有設定をURLで共有などにしていた場合に見れてしまう。

#実装例

ここで一つの実装例を提案するが、これはあくまで例である。私はプログラマーではないので、もっとよい方法は探せばあるだろう。ここではGoogleAppsScriptという言語を用いる。
画像をふんだんに用いて解説するので、一切知識がなくても最後まで読めばそれっぽいものは作れると思う。

**1. エントリーフォーム作成**
まずは普通にエントリーフォームを作る。氏名やメアドなどの個人情報も必要に応じて作る。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/60dbd123-f0e1-fda8-55e7-adfd703cb994.png" width=30%>

Googleフォームの回答欄から自動生成のスプレッドシートに飛べる。これは個人情報満載なので、運営内で厳重に扱うべきだ。
自動生成のスプレッドシート。公開するデータは左に行ごと動かす。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/7aa6d9e5-8227-99a5-6059-e1133f4cdd15.png" width=45%>　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/b9fdec96-beb3-766f-d3f5-c6efd0c71e26.png" width=45%>
**2. 公開用スプレッドシート作成**
自動生成のものとは別に、公開用のスプレッドシートも作る。
現時点では何も打たない空の状態でOK。
自動生成のスプレッドシートで、「ツール」→「スクリプトエディタ」を選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/d9008ee3-137c-0a8f-0cc8-a7c774f7957d.png" width=25%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/7ca2afca-2c2d-33ab-7b87-9a5a12fff421.png" width=35%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/ccb9c69b-1be0-a44c-133a-9501e76bff37.png" width=35%>
**3. 自動生成のものにプログラムを書く**

```javascript:更新プログラム.gs
function entrycopy() {
var beforesheet = SpreadsheetApp.openById('元データのキー'); //元データのキー
var aftersheet = SpreadsheetApp.openById('公開ファイルのキー'); //公開ファイルのキー
 
var bsht = beforesheet.getSheetByName('フォームの回答 1'); //元データファイルのシート名
var range = bsht.getRange("A1:C102").getValues(); //元データのコピーする範囲を指定
var copy1 = range.copy;
 
var asht = aftersheet.getSheetByName('公開ページ'); //公開ファイルのシート名
asht.getRange("A1:C102").setValues(range); //公開データの貼り付ける範囲を指定(コピーと同じ範囲)
}
```
上のプログラムを一つずつ説明する。


```javascript
var beforesheet = SpreadsheetApp.openById('元データのキー'); //元データのキー
var aftersheet = SpreadsheetApp.openById('公開ファイルのキー'); //公開ファイルのキー
```
ここで自動生成のスプレッドシートと公開用のスプレッドシートを変数に登録する。
キーというのは、URLの中に含まれる部分。スプレッドシートごとに違うのでそれぞれで調べる必要がある。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/7dfbd4ec-dc8b-3fcb-b5b1-fc4a9ffc24c8.png" width=100%>

```javascript
var bsht = beforesheet.getSheetByName('フォームの回答 1'); //元データファイルのシート名
var range = bsht.getRange("A1:C102").getValues(); //元データのコピーする範囲を指定
var copy1 = range.copy;
```

一行目は自動生成のファイルのシート名を変数に代入
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/0af044c3-bbca-4319-3f71-212715ae77b5.png" width=100%>
二行目ではコピーする範囲を指定。公開するデータを左に寄せたはずなので、その左上と右下のセルを書く。今回は101人(102マス-1)しか対応していないので、もっと多くの人が来る可能性がある場合は右下のセルを下げればよい。ただし、エントリーシートからはみ出してはいけないので、大きな数にするときは行の追加をする必要がある。

三行目は範囲のデータをcopy1に代入

```javascript
var asht = aftersheet.getSheetByName('公開ページ'); //公開ファイルのシート名
asht.getRange("A1:C102").setValues(range); //公開データの貼り付ける範囲を指定(コピーと同じ範囲)
}
```

一行目は公開用のファイルのシート名を変数に代入
公開ページのところは青矢印のところに応じて変更する
二行目は前のステップでコピーした値を貼り付ける
このときの左上と右下の指定は上でコピーしたものと一致しなくてはいけない。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/ece4b887-d352-13f8-c292-ab14ce21bfa7.png" width=100%>

最後にトリガーの設定
「編集」→「現在のプロジェクトのトリガー」から移動。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/d377925f-b659-12bf-5d8f-783d34e3262c.png" width=45%>　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/6a01bf77-d11d-0399-b595-4fa2e0d24e6f.png" width=45%>
「イベントの種類を選択」をフォーム送信時に変更して保存。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592492/53aba58c-257d-3316-6857-e0b4d04a3366.png" width=75%>

# 完成
フォームで入力してみると公開も自動的に更新されるのが分かるだろう。
個人情報は漏洩しないように厳重に扱って、よいクイズライフを送ろう！