1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GAS×Discord】英単語テストを自動作成・通知するシステムを作ってみた③

Last updated at Posted at 2025-12-04

この記事は、GAS(Google Apps Script)とDiscordを連携させた英単語テスト自動作成システムの開発記録・第3回です。

前回の記事では、開発前のスプレッドシート準備について説明しました。

今回は、 「自動で英単語テストを作成する関数」 の実装をしていきます。

make_test 関数の流れ

以下のような順序で処理を実行していく関数を作る。

  • スプレッドシートを取得
  • フォームを作成
  • スプレッドシートから問題データを取得
  • 全問題からランダムで数問選んでフォームに設定する
  • Discordに作成した英単語テストのURLを送信

make_test 関数作成①

まず関数 make_test を定義する。

function make_test() {

}

正常に実行されるか確認するため、適当に

Logger.log("Hello World!");

などと入れておく。実行ボタンを押す前に必ず保存する。
以下のような画面になったら、実行ボタンを押す。
image.png

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

初回実行時は認証や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 関数の実装完了までを書いていきます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?