橫幅按鈕

2024年9月25日 星期三

Gemini 整理電子書資料,轉成 Wordwall 和 Google 文件 To Google 測驗表單格式



 


請將整理資料為表格,標題欄為題目,選項欄1為是、選項欄2為否,解答欄為答案,並移除括號和題號

請整理為表格,標題欄為題目,選項1欄為 1 選項2欄為 2 選項3欄為 3 選項4欄為 4 ,解答欄為答案,並移除括號和題號


Google 試算表

function onOpen() {
  var ui = SpreadsheetApp.getUi(); // 取得 Google 試算表的 UI
 
  // 在功能表中新增一個自訂選單,並設定選單項目
  ui.createMenu('🧰 整理選單') // 這是主選單的名稱
    .addItem('💡 整理選擇題', 'copyAndMoveDataOnce') // 新增名為"整理題目"的選單,點選後執行copyAndMoveDataOnce
    .addItem('📚 整理是非題', 'copyAndMoveDataToBCA') // 新增名為"整理 BC 到 A"的選單,點選後執行copyAndMoveDataToBCA
    .addToUi(); // 將選單加到 UI 中
}

function copyAndMoveDataOnce() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("Wordwall"); // 設定Wordwall
  var sheet2 = ss.getSheetByName("GoogleDocs"); // 設定GoogleDocs,如果還沒有創建GoogleDocs,手動創建
 
  // 確認GoogleDocs是否存在,若不存在則創建一個新的
  if (!sheet2) {
    sheet2 = ss.insertSheet("GoogleDocs");
  }
 
  // 取得Wordwall的 A2:E 欄所有資料 (從 A2 開始)
  var data1 = sheet1.getRange(2, 1, sheet1.getLastRow() - 1, 5).getValues(); // A2:E最後一行

  // 準備要寫入到GoogleDocs的資料
  var outputData = [];
 
  for (var i = 0; i < data1.length; i++) {
    var aValue = data1[i][0]; // 取得 A 列資料
    var rowData = data1[i].slice(1); // 取得 B:E 列資料
   
    // 將資料按指定格式整理到 outputData
    outputData.push([aValue]); // A 列的資料 (第 1 次)
    for (var j = 0; j < rowData.length; j++) {
      outputData.push([rowData[j]]); // 將 B:E 資料依次放入 A 列
    }
  }
 
  // 清除GoogleDocs的舊資料
  sheet2.clear();
 
  // 將整理好的資料一次性寫入GoogleDocs (從 A2 開始)
  sheet2.getRange(2, 1, outputData.length, 1).setValues(outputData);

  // 新增一個對話框,顯示整理完成的訊息
  var ui = SpreadsheetApp.getUi();
  ui.alert('資料整理完成!');
}

function copyAndMoveDataToBCA() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("Wordwall"); // 設定Wordwall
  var sheet2 = ss.getSheetByName("GoogleDocs"); // 設定GoogleDocs,如果還沒有創建GoogleDocs,手動創建
 
  // 確認GoogleDocs是否存在,若不存在則創建一個新的
  if (!sheet2) {
    sheet2 = ss.insertSheet("GoogleDocs");
  }
 
  // 取得Wordwall的 A2:C 欄所有資料 (從 A2 開始)
  var dataA = sheet1.getRange(2, 1, sheet1.getLastRow() - 1, 1).getValues(); // A 欄資料
  var dataBC = sheet1.getRange(2, 2, sheet1.getLastRow() - 1, 2).getValues(); // B2:C 欄資料

  // 準備要寫入到GoogleDocs的資料
  var outputData = [];

  // 將 A 欄、B 欄和 C 欄資料整理為依次排在 A 欄的格式
  for (var i = 0; i < dataA.length; i++) {
    outputData.push([dataA[i][0]]); // 插入 A 欄的資料
    outputData.push([dataBC[i][0]]); // 插入 B 欄的資料
    outputData.push([dataBC[i][1]]); // 插入 C 欄的資料
  }

  // 清除GoogleDocs的舊資料
  sheet2.clear();
 
  // 將整理好的資料一次性寫入GoogleDocs (從 A2 開始)
  sheet2.getRange(2, 1, outputData.length, 1).setValues(outputData);

  // 新增一個對話框,顯示整理完成的訊息
  var ui = SpreadsheetApp.getUi();
  ui.alert('資料整理完成!');
}


Google 文件

function onOpen() {
  var ui = DocumentApp.getUi(); // 取得 Google 試算表的 UI
 
  // 在功能表中新增一個自訂選單,並設定選單項目
  ui.createMenu('🧰 匯入表單') // 這是主選單的名稱
    .addItem('💡 建立測驗表單', 'createQuizFromActiveDoc') // 新增名為"整理題目"的選單,點選後執行createQuizFromActiveDoc
    .addToUi(); // 將選單加到 UI 中
}

function createQuizFromActiveDoc() {
  // 提示用戶輸入表單名稱
  var ui = DocumentApp.getUi();
  var response = ui.prompt('請輸入測驗表單的名稱:', '例如:我的測驗表單', ui.ButtonSet.OK_CANCEL);

  // 檢查用戶是否選擇了「確定」
  if (response.getSelectedButton() == ui.Button.OK) {
    var formName = response.getResponseText();
    
    // 顯示表單建立中的提示(非阻塞式)
    var progressDialog = HtmlService.createHtmlOutput('<p>正在建立表單...請稍候。</p>')
      .setWidth(300)
      .setHeight(100);
    ui.showModalDialog(progressDialog, '匯入題目');

    // 創建測驗表單
    var doc = DocumentApp.getActiveDocument();
    var form = FormApp.create(formName);
    
    // 將表單設置為測驗表單
    form.setIsQuiz(true);
    
    Logger.log('表單已創建:' + form.getEditUrl());

    var body = doc.getBody();
    var paragraphs = body.getParagraphs();
    
    var currentQuestion = null;
    var options = [];
    var correctAnswers = []; // 使用陣列來存儲正確答案

    for (var i = 0; i < paragraphs.length; i++) {
      var paragraph = paragraphs[i];
      var text = paragraph.getText();
      var isBold = checkIfBold(paragraph);

      // 檢查是否為問題
      if (!isListItem(paragraph) && text.trim() !== '') {
        if (currentQuestion) {
          // 只在 options 不為空的情況下添加問題
          if (options.length > 0) {
            addQuestionToForm(form, currentQuestion, options, correctAnswers);
          } else {
            Logger.log('問題 "' + currentQuestion + '" 沒有選項,未添加到表單。');
          }
        }

        // 新問題開始
        currentQuestion = text;
        options = [];
        correctAnswers = []; // 清空正確答案
      }
      
      // 檢查選項
      else if (isListItem(paragraph)) {
        var optionText = text.trim();
        options.push(optionText);

        // 如果選項是粗體,則設置為正確答案
        if (isBold) {
          correctAnswers.push(optionText); // 將正確答案加入陣列
        }
      }
    }
    
    // 添加最後一個問題
    if (currentQuestion && options.length > 0) {
      addQuestionToForm(form, currentQuestion, options, correctAnswers);
    }

    // 關閉提示視窗
    ui.alert('題目匯入完成!您可以在這裡查看表單:\n' + form.getPublishedUrl());

    // 自動打開表單分頁
    var htmlOutput = HtmlService.createHtmlOutput('<script>window.open("' + form.getPublishedUrl() + '");</script>');
    ui.showModalDialog(htmlOutput, '開啟表單');

    Logger.log('完成!您可以在這裡查看表單: ' + form.getPublishedUrl());
  } else {
    Logger.log('未創建表單。用戶取消了操作。');
  }
}

// 檢查段落中的文字是否為粗體
function checkIfBold(paragraph) {
  var text = paragraph.getText();
  var textObj = paragraph.editAsText();

  for (var i = 0; i < text.length; i++) {
    if (textObj.isBold(i)) {
      return true;
    }
  }

  return false;
}

// 檢查段落是否為清單項目
function isListItem(paragraph) {
  return paragraph.getType() === DocumentApp.ElementType.LIST_ITEM;
}

// 添加問題到表單
function addQuestionToForm(form, questionText, options, correctAnswers) {
  var item;
 
  // 根據正確答案的數量決定題型
  if (correctAnswers.length > 1) {
    item = form.addCheckboxItem(); // 多選題
  } else {
    item = form.addMultipleChoiceItem(); // 單選題
  }

  item.setTitle(questionText);
  item.setRequired(true); // 設置為必填題
  Logger.log('正在添加問題: ' + questionText);
  Logger.log('選項: ' + options.join(', ')); // 添加日誌以顯示收集到的選項

  var choices = options.map(function(option) {
    return correctAnswers.includes(option)
      ? item.createChoice(option, true) // 如果是正確答案,則設置為正確選項
      : item.createChoice(option);
  });

  item.setChoices(choices);
}




沒有留言:

張貼留言

歡迎大家一起留言討論!