//ver1_5 課題作成関数の中に、メニューからの分岐を設けて、一つの関数で全ての課題を作成できるように改良した
//ver1_6 表計算ソフトのsheetsを指定して、問題を作成できるようになった。
//ver1_6_3 先頭番号で出題範囲を指定できりょうに改善
//ver1_6_4 Form内でのrandom機能の確認

var ei_nichi=0;
var ino_rand=0;
var c_or_w=0;

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('FORMの試験を作成');
  //menu.addItem('出題順で作成', 'createForm1');
  //menu.addItem('ランダム順で作成', 'createForm2');
  menu.addSubMenu(                           // サブメニューをメニューに追加する
      ui.createMenu("英語＞日本語　選択肢")             // Uiクラスからメニューを作成する
      .addItem("出題順", "createForm1") 
      .addItem("ランダム順", "createForm2") // メニューにアイテムを追加する    
  ) 
  menu.addSubMenu(                           // サブメニューをメニューに追加する
      ui.createMenu("日本語＞英語　選択肢")             // Uiクラスからメニューを作成する
      .addItem("出題順", "createForm3") 
      .addItem("ランダム順", "createForm4") // メニューにアイテムを追加する    
  )   
  menu.addSubMenu(                           // サブメニューをメニューに追加する
      ui.createMenu("日本語＞英語　キー入力")             // Uiクラスからメニューを作成する
      .addItem("出題順", "createForm5") 
      .addItem("ランダム順", "createForm6") // メニューにアイテムを追加する    
  )  
  menu.addToUi();
}

function createForm1(){
  let ShtName= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Setting Sheet');
  ShtName=ShtName.getRange(3,2).getDisplayValue();
  //ShtName = 'シート2';
  ei_nichi=1;
  ino_rand=1;
  c_or_w=1;
  createForm01(ShtName);
}

function createForm2(){
  let ShtName= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Setting Sheet');
  ShtName=ShtName.getRange(3,2).getDisplayValue();
  //ShtName = 'シート2';
  ei_nichi=1;
  ino_rand=2;
  c_or_w=1;
  createForm01(ShtName);
}

function createForm3(){
  let ShtName= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Setting Sheet');
  ShtName=ShtName.getRange(3,2).getDisplayValue();
  //ShtName = 'シート2';
  ei_nichi=2;
  ino_rand=1;
  c_or_w=1; 
  createForm01(ShtName);
}

function createForm4(){
  let ShtName= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Setting Sheet');
  ShtName=ShtName.getRange(3,2).getDisplayValue();
  //ShtName = 'シート2';
  ei_nichi=2;
  ino_rand=2;
  c_or_w=1; 
  createForm01(ShtName);
}

function createForm5(){
  let ShtName= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Setting Sheet');
  ShtName=ShtName.getRange(3,2).getDisplayValue();
  //ShtName = 'シート2';
  ei_nichi=2;
  ino_rand=1;
  c_or_w=2;
  createForm01(ShtName);
}

function createForm6(){
  let ShtName= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Setting Sheet');
  ShtName=ShtName.getRange(3,2).getDisplayValue();
 // ShtName = 'シート2';
  ei_nichi=2;
  ino_rand=2;
  c_or_w=2;
  createForm01(ShtName);
}

//課題の作成
function createForm01(SheetName){
  var ck = Browser.msgBox('問題作成には数分かかります。ランダム順では出題範囲は考慮されません。', '作成しますか？', Browser.Buttons.OK_CANCEL);
  if (ck == 'ok') {
  var today = Utilities.formatDate(new Date(),"JST", "yyyy/MM/dd_hh:mm:ss");

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sht1 = ss.getSheetByName('Setting Sheet');
  var sht2 = ss.getSheetByName(SheetName);
//学校情報
  const values = sht1.getRange(12, 2, 4, 1).getValues();
//設問数の設定
  var lastRow = sht2.getLastRow();
  var lastCol = sht2.getLastColumn();
  const data = sht2.getRange(2, 1, lastRow - 1, lastCol).getValues();
  const flg =  values[0][0];
  const grade = values[1][0];
  const classr = values[2][0];
  const number = values[3][0];

  const gakunen = [...Array(grade).keys()].map(n => ++n); //学年数
  const kumi = [...Array(classr).keys()].map(n => ++n); //クラス数
  const bangou = [...Array(number).keys()].map(n => ++n); //出席番号数

  var formName = sht1.getRange(2,2).getValue()+'_'+sht1.getRange(3,2).getValue()+'_';
  //var formName = sht1.getRange(2,2).getValue();
  var QuestionNum = sht1.getRange(4,2).getValue();
  var title0 = sht1.getRange(3,2).getValue();
  var SentakushiNum = sht1.getRange(5,2).getValue();
  var Point = sht1.getRange(6,2).getValue();
  var sento = sht1.getRange(7,7).getValue()-1; //とりあえず先頭番号 -1 をここに格納
  if(sento <0 ) {sento=1}  //先頭番号が不正のときは、強制的に１を代入
  var shuffle = sht1.getRange(8,2).getValue();
  var arr = [];
  var sentakushi = [];
 
  if (ei_nichi==2){
     var title0='次の日本語を英語に直しなさい'
  } else {var title0='次の英語を日本語に直しなさい'};

//フォームを作成する
  var form = FormApp.create(formName　+ today);
//  form.setDescription(title0);
  if(flg == 1){

//学年
  form.addListItem()
    .setTitle('学年を選んでください。')
    .setChoiceValues(gakunen)
    .setRequired(true);
//クラス
  //form.addPageBreakItem().setTitle('クラス');
  form.addListItem()
    .setTitle('クラスを選んでください。')
    .setChoiceValues(kumi)
    .setRequired(true);
//番号
  //form.addPageBreakItem().setTitle('出席番号'); 
  form.addListItem()
    .setTitle('出席番号を選んでください。')
    .setChoiceValues(bangou)
    .setRequired(true);
  //form.addPageBreakItem().setTitle('氏名');

//氏名
  form.addTextItem()
    .setTitle('フルネームを入力してください')
    .setRequired(true);
  }
 form.addPageBreakItem().setTitle('問題数は全部で' + QuestionNum + '問です。'+'　'+title0); //改行は '\n'で行う
// form.addPageBreakItem().setTitle(title0);

//フォーム内で問題順を変えるオプションを on off
//  form.setShuffleQuestions(false);
  if(shuffle == 1){
    form.setShuffleQuestions(true);
  }else{
    form.setShuffleQuestions(false);
  }

//  form.setCollectEmail(true);
//  form.setCollectEmail(false);'
  form.setIsQuiz(true);
  
//ここから3つは、奥崎の付け足し 
if(flg == 1){
  form.setCollectEmail(true);
//form.setPublishingSummary(true);
  form.setLimitOneResponsePerUser(true);
}
//シャッフルするかしないか
if (ino_rand==2){
  var a1 = data.length;
  while (a1) {
    var b1 = Math.floor(Math.random() * a1 );
    var t1 = data[--a1];
    data[a1] = data[b1];
    data[b1] = t1;
  }
}
//フォームを作成する
  for(var i = 0; i <= QuestionNum - 1; i++) {
//選択肢作成開始
  if (ei_nichi==2){
    var content = data[i+sento][2]; content2 = data[i+sento][1];
  } else{
    var content = data[i+sento][1]; content2 = data[i+sento][2]; //here 1>2
  }

 // const content = data[i][1];

    arr.length = 0;
    var a = data.length;
    for(var j = 0; j < a; j++){
      if (ei_nichi==2){
      arr[j] = data[j][1];
      } else {
      arr[j] = data[j][2]; 
      }
    // arr[j] = data[j][2];
    }
  //もし、選択肢を解答としている場合は  
  if (c_or_w==1) {
        var item = form.addMultipleChoiceItem();
    //    item.setTitle("第" + (i + 1)  + "問 " + content);
        item.setTitle(content);
        sentakushi.length = 0;
    //正解
        sentakushi.push(item.createChoice(arr[i+sento],true)); //下３行に +sento を入れてみる
        var kaitou = arr[i+sento];
        arr.splice(i+sento,1);
    //不正解の並べ替え
        var a1 = arr.length;
        while (a1) {
          var b1 = Math.floor(Math.random() * a1 );
          var t1 = arr[--a1];
          arr[a1] = arr[b1];
          arr[b1] = t1;
        }
        arr = arr.filter(function(value, index, self){ return self.indexOf(value) === index;});
        for(k = 0; k < SentakushiNum -1; k++){
          if(arr[k] !== kaitou){
            sentakushi.push(item.createChoice(arr[k],false));
          } else {
            sentakushi.push(item.createChoice(arr[k + SentakushiNum],false));
          }
        }
        //選択肢シャッフル
        Logger.log(sentakushi);
        var a2 = sentakushi.length;
        while (a2) {
          var b2 = Math.floor(Math.random() * a2 );
          var t2 = sentakushi[--a2];
          sentakushi[a2] = sentakushi[b2];
          sentakushi[b2] = t2;
        }
        item.setChoices(sentakushi);
        item.setRequired(true);
        item.setPoints(Point);
    } else {  //もし、文字で記入する場合は次の処理
        var item = form.addTextItem(); 
        //var item = form.addMultipleChoiceItem();
        item.setTitle(content);
        //item.setTitle(content+content2);
        item.setHelpText(content2);
        //item.setFeedbackForCorrect(content2);
        //item.setFeedbackForCorrect(FormApp.createFeedback().setText(content2).build());
        //item.setChoices(sentakushi);
        //item.setRequired(true);
        item.setPoints(Point);    
    }   
  }
  sht1.getRange(10,2).setValue(form.getPublishedUrl());
  sht1.getRange(11,2).setValue(form.getEditUrl());
  Browser.msgBox('テストを作成しました。 \\n Googleドライブから作成されたテストフォームを開いてください。');
  }
  if (ck == 'cancel') {
    Browser.msgBox("キャンセルを押しました");
  }
}

function toFullWidth(value) {
  if (!value) return value;
  return String(value).replace(/[!-~]/g, function(all) {
    return String.fromCharCode(all.charCodeAt(0) + 0xFEE0);
  });
}