利用google apps script 將Google sheet 中兩個工作表中的資料對應

URL Link //n.sfs.tw/15874

2022-06-21 11:11:05 By igogo

 

 

利用google測驗收回來的學生資料兩百筆, 而且因為進行測驗時, 學生送出成績是隨機的, 要怎麼對應到我從校務系統下載的班級名單呢

 

 

 

 

底下為將工作表-名單中的學號與工作表-成績評量中的學號進行比對

只要找到成績中有答題者, 就把分數寫回名單中

 

這是個簡單但是很沒效率的方法, 如果兩個工作表各有100筆, 表示要比對100x100=10000次

所以如果跑太久跑不完,  必須成班級

畢竟google apps script 是有名的慢

本次學生數191人,  一次跑完約2分鐘

 

function main() {
  let spreadSheet = SpreadsheetApp.getActive();
  let nameSheet = spreadSheet.getSheetByName("名單");
  let examSheet = spreadSheet.getSheetByName("評量");
  let lastRow = nameSheet.getLastRow();
  let students = [];
  //收集學生名單
  for (let i = 2; i < lastRow + 1; i++) {
    let seat = nameSheet.getRange(i, 3, 1, 1).getValue().toString();

    if (seat.length == 1) {
      seat = '0' + seat;

    }

    let id = nameSheet.getRange(i, 1, 1, 1).getValue().toString() + nameSheet.getRange(i, 2, 1, 1).getValue().toString() + seat;
    let student = {};
    student.id = id;

    nameSheet.getRange(i, 5, 1, 1).setValue(id);

    students.push(student);
  }

  //取得學生分數
  lastRow = examSheet.getLastRow();
  for (let i = 2; i < lastRow + 1; i++) {
    id = examSheet.getRange(i, 2, 1, 1).getValue().toString();

    students.forEach(student => {
      if (student.id == id) {
        scores = examSheet.getRange(i, 1, 1, 1).getValue();
        student.scores = scores;
      }
    })


  }

  //寫入學生分數
  lastRow = nameSheet.getLastRow();
  for (let i = 2; i < lastRow + 1; i++) {
    id = nameSheet.getRange(i, 5, 1, 1).getValue().toString();
    students.forEach(student => {
       
       if(student.id == id){
         nameSheet.getRange(i, 6, 1, 1).setValue(student.scores);
       }

    })
  }


}