この記事は、GAS(Google Apps Script)とDiscordを連携させた英単語テスト自動作成システムの開発記録・第3回です。
前回の記事では、開発前のスプレッドシート準備について説明しました。
今回は、 「自動で英単語テストを作成する関数」 の実装をしていきます。
make_test 関数の流れ
以下のような順序で処理を実行していく関数を作る。
- スプレッドシートを取得
- フォームを作成
- スプレッドシートから問題データを取得
- 全問題からランダムで数問選んでフォームに設定する
- Discordに作成した英単語テストのURLを送信
make_test 関数作成①
まず関数 make_test を定義する。
function make_test() {
}
正常に実行されるか確認するため、適当に
Logger.log("Hello World!");
などと入れておく。実行ボタンを押す前に必ず保存する。
以下のような画面になったら、実行ボタンを押す。

出力が以下のようになれば、関数定義&実行が問題なくできている。

初回実行時は認証やGoogleへの再ログインを求められるが、すべて許可する必要がある。
(※ 許可しないと関数を実行できない)
もし権限がエラーになった場合は、Googleアカウントの再ログイン・スクリプトエディタの再読み込みなどを試してみると良い。
スプレッドシートを取得
現在紐づけしているスプレッドシートから問題を取得したいので、まずそれらを変数で取得しておく。
//スプレッドシート取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
//スプレッドシートのシート取得
const questionSheet = ss.getSheetByName("テストに出す英単語用");
const answerSheet = ss.getSheetByName("回答収集用");
const urlSheet = ss.getSheetByName("フォームのリンクと結果");
//シートの行数・列数を取得
const questionLastRow = questionSheet.getLastRow();
const questionLastCol = questionSheet.getLastColumn();
//1列目の最後の行を取得
const answerLastRow = answerSheet.getRange(answerSheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
シート名でシートを取得するので、名前を変更した場合はここも変更する必要がある。忘れがちなので注意。
answerLastRowの部分のコードは複雑で、何をしているか分かりづらいため備忘録を兼ねて記録しておく。
answerLastRowの流れ
-
getMaxRows()でシートに存在する全ての行を取得 -
getRange(answerSheet.getMaxRows(), 1)シートの最終行・1列目(つまり一番下のA列のセル)を指定 -
getNextDataCell(SpreadsheetApp.Direction.UP)指定したセルから上方向(UP)に向かって最初にデータが入っているセルを探す
⇒「A列で最後にデータが入っているセル」を探す動作
フォーム作成
テストとなるGoogleフォームを作っておく。
いつ作ったか分かりやすくするため、フォームのタイトルは作成された年月日が入るように設定する。
//フォームタイトル設定
let formTitle = Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd_hh:mm:ss_英単語テスト");
//フォーム作成
let form = FormApp.create(formTitle);
テスト形式にしたいので以下の設定をしていく。
- クイズモードON
- 回答回数を1回に制限
form.setIsQuiz(true); //クイズモードON
form.setLimitOneResponsePerUser(true); //回答を1回に制限
スプレッドシートとも連携させておく。(採点の際に「トリガー」という機能を使用する関係で必要なため)
form.setDestination(FormApp.DestinationType.SPREADSHEET,ss.getId());
また、作成したフォームはこのあと作成する別の関数でもアクセスしたいので、Propertiesサービスを利用して保存しておく。
//フォームIDを取得
const formId = form.getId();
//スクリプトプロパティに保存
PropertiesService.getScriptProperties().setProperty('FORM_ID', formId);
さいごに
今回は make_test 関数の定義と、フォームの作成までを行いました。
次回は make_test 関数の実装完了までを書いていきます。