この記事は、GAS(Google Apps Script)とDiscordを連携させた英単語テスト自動作成システムの開発記録・第8回(最終回)です。
前回の記事では、「苦手問題全問テスト」機能の実装(make_nigate関数の実装)を行いました。
今回は、make_nigate関数の挙動確認と補助機能の追加を行っていきます。
make_nigate 関数の挙動確認
前回作成したmake_nigateを実行すると、Discordにフォームのリンクが正常に届き、以下のようなフォームが開く。
スプレッドシートの「回答収集用」シートは以下のような状態なので、正しく苦手問題が抽出されていることが分かる。
上記のように、make_nigateが正しく動作することは確認できた。しかし、この関数は定期的に自動実行するものではなくトリガーを設定していない。そのため、現在のままでは毎回スプレッドシートからGASのスクリプトエディタを開き、関数を実行する必要がある。
これでは手間がかかるため、スプレッドシートから直接実行できるように補助機能を追加していく。
onOpen 関数作成
これから、スプレッドシートに関数を実行できるカスタムメニューを作成していく。その際に使用するのが、onOpenという特別な関数である。
onOpen 関数とは
onOpen関数は、GASで予約されたトリガー関数と呼ばれるものの一つである。通常の関数と違う点としては、
- スプレッドシートを開いたときに自動で呼び出される
- 関数名が固定
ということが挙げられる。
この関数を使用することで、カスタムメニューや初期設定を追加できる。
カスタムメニュー作成
実際にスプレッドシート上に関数を実行できるカスタムメニューを追加していく。
流れとしては以下のようになる。
- スプレッドシートのUIを取得
- メニューを作成
- メニューに項目を追加
- メニューをUIに追加
1. スプレッドシートのUIを取得
const ui = SpreadsheetApp.getUi();
UI(ユーザーインターフェース)オブジェクトを通じることで、スプレッドシート上のメニューやサイドバーなどを操作できる。
2. メニューを作成
const menu = ui.createMenu("英単語テスト手動作成");
ここで指定した名前がスプレッドシート上で表示されるメニュー名になる。
この時点ではメニューの中身が空(つまりメニューだけ作ったけど選択しても何も表示されない状態)なので、項目を追加する。

上の画像でいうと、「ファイル」というメニュー自体は作成したが、それを選択した際に表示される「新規作成」「開く」「インポート」などの項目は追加されていない状態。
3. メニューに項目を追加
menu.addItem("テスト作成", "make_test");
menu.addItem("苦手問題全問テスト作成", "make_nigate");
.addItem("表示名", "関数名")で、メニューにクリック可能な項目を追加できる。
- 表示名:スプレッドシートに表示される文字列
- 関数名:クリック時に呼び出すGASの関数名
※このとき、設定するGASの関数は「引数なし」である必要がある点に注意。
4. メニューをUIに追加
menu.addToUi();
.addToUiでスプレッドシートのメニューバーにメニューを表示できる。
ここまで記述しておけば、スプレッドシートを開いた際に以下のようなメニューが表示される。

これで、手動でテストを作成したい時に毎回GASのスクリプトエディタを開く必要がなくなる。
reset 関数作成
実際にシステムを使用した際に、正答率をリセットできるボタンがあると便利だと感じたため、reset関数を追加する。
function reset() {
//スプレッドシート類を取得する
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("回答収集用");
const lastRowJ = sheet.getRange(1, 10).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow();
//「回答収集用」シートの出題数・正解数の列を取得する
const range = sheet.getRange(2, 12, lastRowJ, 2);
const values = range.getValues();
//出題数・正解数を0に直す
for (let i = 0; i < values.length; i++) {
values[i][0] = 0;
values[i][1] = 0;
}
// 0にリセットした値をシートに入力する
range.setValues(values);
}
これもスプレッドシート上にメニューとして表示させたいので、onOpenに以下のコードを追加する。
//UIにメニューを作成
const menuReset = ui.createMenu("リセット");
//メニューに項目を追加
menuReset.addItem("正答率リセット", "reset");
//メニューをUIに追加
menuReset.addToUi();
問題なく作動すれば、スプレッドシートのメニューバーは次のような表示になる。

さいごに
今回で、英単語テスト自動作成システムの開発記録はひとまず終了となります。
基本的な機能は実装できましたが、まだ改善の余地がある所・機能を追加すべき所ばかりなので、今後もアップデートしていきたいと思います。
本シリーズがGAS×Discordの具体的な実装例として参考になれば幸いです。

