さかなの思い

競技プログラミングの話が主になるかもしれません

GASを用いてGoogle Form上のクイズの作成を自動化する

オンラインでクイズ大会を開く場合、従来のペーパークイズの代わりにオンラインで解けるクイズ(Google Formなどを用いて)を実施したいと考えることがあります。
しかし、そこには手間が生じます。
なぜなら、問題の管理は多くの場合Excelファイルで行っていることが多く、Wordに直に貼り付けることができるオフラインのペーパークイズとは違い、フォームに1つ1つ問題をコピペしなければなりません。これは非常に面倒くさいです。

よって、この作業をGAS上で自動化しましたので、その方法について備忘録・情報共有的な意味を込めてブログに残しておきます。

使用方法

  1. 以下のコードの各種設定項目に数値を記入する
  2. 問題の並んでいるExcelGoogle ドライブ上でSpread sheetに変換する
  3. [ツール] > [スクリプトエディター] を開いて、コードを貼り付けて実行する

コード

function myFunction() {
 // ペーパーラウンドのGoogle Formをスプレッドシートから作成する
 
 // ********** 各種設定事項 **********
 
 // タイトル
 var Title = '第1R 100問4択ペーパークイズ';
 
 // 問題数
 var Questions = 100;
 
 // ページ数(問題数の約数にしてください)
 var Page = 10;
 
 // 問題が並んでいるシートの名前
 var SheetName = '提出フォーマット';
 
 // ここから、スプレッドシートの内容について
 
 // 問題文が並んでいる列を0-indexで取得(A列 -> 0, B列 -> 1, C列 -> 2, ... )
 var QuestionTextIdx = 3;
 
 // 選択肢が並んでいる列を0-indexで取得
 var ChoiceIdx1 = 5, ChoiceIdx2 = 6, ChoiceIdx3 = 7, ChoiceIdx4 = 8;
 
 // 答え(1, 2, 3, 4のいずれか)が並んでいる列を0-indexで取得
 var AnswerIdx = 9;
 
 // 1問目が記入されている行を0-indexで取得(1行 -> 0, 2行 -> 1, 3行 -> 2, ... )
 var QuestionStartIdx = 3;
 
 // ********** 各種設定事項 終わり **********
  
  var form = FormApp.create(Title);
  
  // スプレッドシートの選択
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const values = ss.getSheetByName(SheetName).getDataRange().getValues();
  
  // テスト形式に設定
  form.setIsQuiz(true);
  form.setProgressBar(true);

  // ********** ここから 問題文の設定 **********
  
  var M = Questions / Page;
  
  for(var i=0;i<Page;i++){
    // このページのタイトル
    var start = i * M + 1, end = (i + 1) * M;
    var PageTitle = 'Q' + String(start) + ' ~ Q' + String(end);
    form.addPageBreakItem().setTitle(PageTitle);
    
    for(var j=0;j<M;j++){
      // 今何問目?
      var Idx = i * 10 + j;
      
      var item = form.addMultipleChoiceItem();
      
      // 問題文
      var QuestionStatement = 'Q' + String(Idx + 1) + '.  ' + values[Idx+QuestionStartIdx][QuestionTextIdx];
      item.setTitle(QuestionStatement);
      
      // 正解
      var answer = values[Idx+QuestionStartIdx][AnswerIdx];
      // 正解選択肢の設定
      var flags = [false, false, false, false];
      flags[answer - 1] = true;
      
      item.setChoices([
        item.createChoice('[A].  ' + values[Idx+QuestionStartIdx][ChoiceIdx1], flags[0]), 
        item.createChoice('[B].  ' + values[Idx+QuestionStartIdx][ChoiceIdx2], flags[1]), 
        item.createChoice('[C].  ' + values[Idx+QuestionStartIdx][ChoiceIdx3], flags[2]), 
        item.createChoice('[D].  ' + values[Idx+QuestionStartIdx][ChoiceIdx4], flags[3])
        ]);
      item.setPoints(1);
    }
  }
  form.addPageBreakItem();
}

制作アプリ一覧

ガチ素因数分解

表示されている合成数を、制限時間内に出来るだけたくさん素因数分解していくアプリです。

f:id:Enjapma:20200329170954p:plainf:id:Enjapma:20200329171016p:plain

ガチ素因数分解

ガチ素因数分解

無料posted withアプリーチ

カラフルロボット工場

ベルトコンベアに乗って流れてくるロボットと、自機の色のRGB値のズレを出来るだけ小さくするアプリです。

f:id:Enjapma:20200408180845p:plainf:id:Enjapma:20200408180932p:plain

カラフルロボット工場

カラフルロボット工場

無料posted withアプリーチ

直進!スライム

まっすぐにしか進めないスライムをゴールへ導く、パズルゲーム です。全45ステージです。

f:id:Enjapma:20200905033438p:plainf:id:Enjapma:20200905033557p:plain


直進!スライム

直進!スライム

無料posted withアプリーチ

App storeでiOSアプリを公開するまでにやったこと

iOSアプリを作りました
制限時間内に素因数分解をしていくゲームです

ガチ素因数分解

ガチ素因数分解

  • Chikai Ito
  • Games
  • Free
apps.apple.com

  • この記事の目的
  • 1 環境構築
  • 2 学習
    • 2-1 Swift
    • 2-2 SpriteKit
  • 3 実装
  • 4 リリース
  • 5 教訓
  • 6 次回への展望
続きを読む