メンバー管理シートとフォームの連携
- 2022.01.06
- GoogleAppsScript
- spreadsheet
前の記事「スプシでメンバー管理」のシートができてる前提ですすめる
連携済なのでメンバー管理シートをコピーするだけでGASもフォームもコピーされそうだけど、連携はやり直さないと使えないかも?しくみがわかればやりやすいと思うので見てみてください。
連携させるフォームを作る
Googleフォームを作成

メンバー管理用のフォームってわかる名前にしとくと良いです。
フォームの質問を作る

基本的にはシートの Member List の項目と合わせておく。
Nameは選択肢の自動取得と、Member List のデータ並び替えの基準になるので外さない。
他は好きな項目に変更したり追加したり。
連携のため、Nameの項目は「プルダウン」にしておく。
回答をスプレッドシートにリンク

回答>スプレッドシートにリンクをおす

送信先をメンバー管理シートにしておく

メンバー管理シートに戻るとタブができてるよ
途中で質問を追加しても大丈夫
Members Listには、Z列まで途中で追加した質問の回答が表示できるようになってます。
列を追加&関数を追加すればもっといけます。
表示側で調整するとグループ分けできたりするので上手に使ってください。
送信ボタンからURLを取得
これをメンバーに公開して入力してもらう。
メンバー管理シートのJoinから登録したメンバーの名前をフォームの選択肢にするGAS
いよいよGASを作るぞー!いっぱい検索した。
1.メンバー管理シートの 拡張機能>Apps Script を開く

最初はプロジェクトを作成しています〜って出るので待ってあげる。
プロジェクトの名前もgsの名前もなんでもよい。
2.gsを編集
function overwriteNameList() {
/**
// スプレッドシートの情報を取得する
**/
// ①:コピーして作成した自分のメンバー管理シートのIDを設定 → 「https://docs.google.com/spreadsheets/d/●●●●●/edit」●●●●●を↓に記述
// ②:コピーしたそのままだとタブ名に「のコピー」ってついてる場合があるので、メンバー管理シートのタブ名の方をDataにリネームできているか確認★
var sheet = SpreadsheetApp.openById('●●●●●').getSheetByName("Data");
// DataタブのS1セルがNAMEだった場合に実行する
if("NAME" == sheet.getRange("S1").getValue()){
// DataタブのS列(メンバー登録した情報を抽出したメンバーの名前)の、2行目からコンテンツをもつ最後の行までの値を配列で取得する
var colS = sheet.getRange(2, 19, sheet.getLastRow() - 1).getValues();
}
/**
// Googleフォームのプルダウン内の値を上書きする
**/
// ③:GoogleフォームのIDを設定 →「https://docs.google.com/forms/d/〇〇〇/edit」の〇〇〇を↓に記述
var form = FormApp.openById('〇〇〇');
// 質問項目がプルダウンのもののみ取得
var items = form.getItems(FormApp.ItemType.LIST);
items.forEach(function(item){
// 質問項目が「Name」を含むものに対して、スプレッドシートの内容を反映する
if(item.getTitle().match(/Name.*$/)){
var listItemQuestion = item.asListItem();
var choices = [];
colA.forEach(function(name){
if(name != ""){
choices.push(listItemQuestion.createChoice(name));
}
});
// プルダウンの選択肢を上書きする
listItemQuestion.setChoices(choices);
}
});
}
①:コピーして作成した自分のメンバー管理シートのIDを設定
「https://docs.google.com/spreadsheets/d/●●●●●/edit」●●●●●を記述
②:コピーしたそのままだとタブ名に「のコピー」ってついてる場合があるので、メンバー管理シートのタブ名の方をDataにリネームできているか確認★
③:GoogleフォームのIDを設定
「https://docs.google.com/forms/d/〇〇〇/edit」の〇〇〇を記述
①〜③ができたら保存マークを押して、実行してみる
実行ログで実行完了と出たらできあがり
3.トリガーを設定する

トリガーを開いて、右下にある

を押す

- 実行する関数を選択:
今回作ったGASの名前になってればok - 実行するデプロイを選択:
Head(変更しない) - イベントのソースを選択:
スプレッドシートから - イベントの種類を選択:
変更時
に設定して、保存を押す。
保存後何か出てくるので自分のアカウントを選んですすむ。




これでJoinタブからメンバー登録するとフォームの質問Nameの選択肢にメンバーの名前が追加されるようになる。やったぜ。
参考サイト
https://qiita.com/xAGAx/items/9bf13b020cb605908cf5
フォームの回答をMembers Listに組み込む
何回でもフォームの回答を送信できる前提なので、タイムスタンプで並び替えて最新の情報を表示できるようにしたい。
並び替え用のSortタブを作って、お名前を基準にしてMembers Listに表示させるしくみ。
タブの名前から「 のコピー」を消して正常な名前にリネームしてあれば、データが出ないセルでエンター押すと正常に表示される、と思う。
スプシとフォームの連携はここまで。
次の記事で、フォーム回答時にwebhookを使ってDiscordに通知を送る、をやる!