Google スプレッドシート で 脳トレ問題を作ってみた・・・

この記事は約3分で読めます。

Google Chrome アプリケーション に スプレッドシート があります。
知らない、触ったことのない方は、Excel のWeb版の簡易版的なアプリケーションを想像して下さい。

小中学校で配布されているパソコン、ChromeBook、その中のアプリケーションでもあるスプレッドシート、プログラミミングに興味を持つ子ならば、ブロックを重ねて動かすプログラミング以上のことまで、環境を変えることなくできるスクリプトで作っても面白いかな?

そんな発想もあり、作ってみました。

このスプレッドシートは、Excelのマクロの代わりに、スクリプトと呼ばれるコードが記述できます。
Excelと同様に、操作記録を記録しコーディングしてくれますので、試しに記録して、そこから編集する流れも可能です。😸

脳トレ問題の中に、1文字だけ違う文字を探せ!!
みたいなのがありますが、Excelやこのスプレッドシートでも作ることが出来ないのかな?
との思いから、、、作ってみました。

作成したのはこんな感じの問題

数パターンの組み合わせで、毎回違う場所、ランダムな位置に違う文字を出す。
また、探し出すのに要した時間を出すようにしてみました。

GoogleAppScript1

「スタート」ボタンを押下で、問題を表示する

この分部の仕組み、流れは?

  1. 問題を決める。
  2. この問題も数パターンの中からランダムに選ばれるようにする
  3. 1文字だけ違う文字の場所を決める。行、列の位置決めもランダムに出るようにする。
  4. 10行×10列に文字を配置する。
  5. 開始時間、違う文字の位置を保存する。

といった感じです。

コードはこんな感じに・・・

  let startTime;
  let posRow;
  let posCol;
  let spreadsheet = SpreadsheetApp.getActive();
  let q, ansN, ansD;
  // 入力シート
  let inshert = spreadsheet.setActiveSheet(spreadsheet.getSheetByName('仲間外れ'), true);
  startTime = new Date();
  q = Math.floor(Math.random()*5 );
  posRow = Math.floor(Math.random()*9 );
  posCol = Math.floor(Math.random()*9 );
  switch (q) {
    case 0:
      ansN = "B";
      ansD = "P";
      break;
    case 1:
      ansN = "例";
      ansD = "列";
      break;
    case 2:
      ansN = "Q";
      ansD = "O";
      break;
    case 3:
      ansN = "5";
      ansD = "S";
      break;
    default:
      ansN = "力";
      ansD = "刀";
      break;
  }
  for(var r = 0; r< 10 ; r++){
    for(var c=0; c<10; c++){
      inshert.getRange( r+2, c+2 ).setFontColor("#000000");
      if(r==posRow && c==posCol){
        inshert.getRange(r+2,c+2).setValue(ansD);
      }else{
        inshert.getRange(r+2,c+2).setValue(ansN);
      }
    }
  }
  inshert.getRange('M3').setValue(posRow);
  inshert.getRange('M4').setValue(startTime);
  inshert.getRange('M5').setValue(posCol);
  inshert.getRange('M6').setValue(startTime);

プログラミングコードの説明は、省略しますので、時間がある時にでも、調べて下さいネ♪

ランダムな位置に出すには?

Math.random関数を使って、問題と違う文字の表示位置を実行都度取得するようにしました。
この関数の使い方について詳しくは、述べませんが、興味があれば調べて使って見て下さい。

また、条件分岐として、Switch 文、If文と使い分けしております。
Switch文を使うと、問題の追加時が、楽ですから、、、、

ボタンの背面の箇所を使って、値の保存をしています。😓
こんな隠し技?もあります。

「回答」ボタン押下で、違う文字に色を付け、時間を表示する

コーディングしたのは、こんな感じです。

  let endTime;
  let posRow;
  let posCol;

  endTime = new Date();

  let spreadsheet = SpreadsheetApp.getActive();
  let inshert = spreadsheet.setActiveSheet(spreadsheet.getSheetByName('仲間外れ'), true);

  posRow = inshert.getRange('M3').getValue();
  posCol = inshert.getRange('M5').getValue();
  inshert.getRange('M6').setValue(endTime);
  inshert.getRange( posRow+2, posCol+2 ).setFontColor("#ff0000");

公開しているプログラミングコードは、参考であり、この通りに作らないとダメではありません。
当然、このような方法よりも、もっとよいコーディング例は、たくさんあることでしょうし、自分で考えられるかも知れません。

Google スプレッドシートで、こんなことも出来ますよ~といった事例として書いております。

色を変えるには?

違う文字の色を赤にしています。
赤くするので、問題生成時に、おなじ色に設定する処理を追加しています。

このために、1文字違う文字を出す位置を覚えておくといった処理にしています。

開始した時間と「回答」を押下した時間の差(引き算)でタイムを計算しています。
こちらは、セルに計算式をあらかじめ埋め込んでいます。

最後に

最後に、「回答」時に、正誤を判断する仕組みもありかと思いますが、(現在のアクティブな場所と正解の位置などで)そこまでする必要もないかと思い組込んでいません。

改良の可能性を持たせていますので、追加機能を組み込んで見て下さい♪

タイトルとURLをコピーしました