2021/12/19に更新

【GASで学習】無限ドリル(足し算、掛け算)

スプレッドシート学習

足し算や掛け算をずーっと楽しむことができるGoogle Apps Scriptです。お子様の学習に役立つかもしれ・・・ません。

こんな悩みを解決します


  • 足し算や掛け算をずーっと解いていたい。
  • 環境に配慮してペーパーレスで計算ドリルをやりたい。

用意するもの


特にありません。スプレッドシートに組み込むだけですが、このスクリプトはトリガーを利用します。

このスクリプトで出来ること


シート上に計算問題が用意され、答えを入力すると正誤判定が行われます。
正解なら次の問題へ、不正解ならアラートが表示されます。
終わりはありませんので無限にドリルを解くことができます。
足し算モードと掛け算モードを用意しています。

使い方


1.問題の生成

メニューから「無限ドリルを開始する」を選択すると、問題や解答入力欄が用意されます。
足し算モードと掛け算モードがあるのでお好きな方を起動してください。

2.ドリルを楽しむ

あとはひたすらドリルを楽しむだけです。

正解すると右の「連続正解」が増えていきます。

不正解だと「まちがっているみたい・・・」とアラートが出て、連続正解数がリセットされてしまいます。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00029/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('無限ドリル(足し算)を開始する', 'initialize_drill_addition');
  menu.addItem('無限ドリル(掛け算)を開始する', 'initialize_drill_multiplication');

  // メニューを画面に追加する
  menu.addToUi();
}


function initialize_drill_addition(){

  // addItemには関数の引数が入れられないようなので1つ挟む
  initialize_drill('+');

}


function initialize_drill_multiplication(){

  // addItemには関数の引数が入れられないようなので1つ挟む
  initialize_drill('✕');

}


function initialize_drill(operation) {

  const ss = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシートを呼び出す
  const sheet = ss.getActiveSheet(); // アクティブなシートを呼び出す
  let range = sheet.getRange(1, 1, 2, 7); // A1を起点に、入力欄などを用意する

  values = []; // 書き込み用の配列
  values[0] = []; // 書き込み用の配列(1行目)
  values[1] = []; // 書き込み用の配列(2行目)

  values[0][0] = '問題';
  values[0][4] = '答え';
  values[0][6] = '連続正解';

  values[1][0] = Math.floor(Math.random() * 100); // 計算式の左辺
  values[1][1] = operation; // 足し算 or 掛け算
  values[1][2] = Math.floor(Math.random() * 100); // 計算式の右辺
  values[1][3] = '=';
  values[1][6] = 0; // 連続正解数の初期値

  range.setValues(values); // セルへ書き込み

  range.setFontSize(18); // フォントサイズを指定
  range.setHorizontalAlignment('center'); // 水平方向の位置を指定
  range.setVerticalAlignment('middle'); // 垂直方向の位置を指定
  range.setBackgroundRGB(255, 255, 255); // 背景色を指定
  range.setBorder(true, true, true, true, true, true, "BLACK", SpreadsheetApp.BorderStyle.SOLID_THICK); // 罫線の指定

}


function onEdit(e) {

  // 変更されたセルが解答入力欄以外の場合は何もしない
  if(e.range.getA1Notation() != 'E2'){
    return;
  }

  const ss = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシートを取得
  const sheet = ss.getActiveSheet(); // アクティブなシートを呼び出す
  let range = sheet.getRange(2, 1, 1, 7); // A2を起点に必要な範囲を取得
  let values = range.getValues(); // 値を2次元配列で取得

  const ui = SpreadsheetApp.getUi(); // 不正解時にアラートを出すため、UIを取得

  let answer_input = values[0][4]; // 入力された答え

  let formula_left = values[0][0]; // 計算式の左辺
  let formula_right = values[0][2]; // 計算式の右辺
  let operation = values[0][1]; // 四則演算タイプ(+ / ✕)
  let correct_answer_count = values[0][6]; // 連続正解数

  let answer_correct = ''; // 正解を入れる変数

  // 正しい答えを計算する
  if (operation == '+') {
    answer_correct = formula_left + formula_right;
  } else if (operation == '✕') {
    answer_correct = formula_left * formula_right;
  }

  let values_update = values[0]; // セルの更新用配列

  if (answer_input == answer_correct) {

    // 正解なら連続正解数を更新する
    if (correct_answer_count >= 0) {
      values_update[6] = correct_answer_count + 1;
    } else {
      values_update[6] = 1;
    }

    // 答え入力欄を消去する
    values_update[4] = '';

    // 問題を更新する
    values_update[0] = Math.floor(Math.random() * 100);
    values_update[2] = Math.floor(Math.random() * 100);

  } else {
    ui.alert('まちがってるみたい・・・');
    values_update[6] = 0; // 不正解時は連続正解数をリセット
  }

  range.setValues([values_update]); // 新しい問題や連続正解数などをセルに書き込み
  sheet.getRange(2,5,1,1).activate(); // 続けて回答ができるように答え入力セルに移動する

}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp