从一张纸上提取数据并通过两个键将其匹配到另一张电子表格中的另一张纸上...更快

时间:2018-08-11 23:49:34

标签: javascript google-apps-script google-sheets

我肯定有一个简单的答案,我只是还没学会。 我的代码正在运行,速度非常慢(超时),而且我知道外面有一个比我聪明的人知道一种更好的方法来完成此任务。

我要完成的工作: 我有很多多个年级电子表格(每个课程在Jr高中一个),每个电子表格都有一个由学生ID和其年级,行为指标,缺失的评估数量和免除的评估数量列出的学生列表。一份研究生数据表中收集的所有年级书籍的所有数据,以供参考。

为了完成此任务,我需要将学生ID和班级ID与母版的学生ID和班级ID匹配,然后复制数据。两者必须匹配。一个学生ID将具有多个班级ID,而一个班级ID将具有多个班级ID。

在成绩册和硕士中,每行都有一个学生ID,而每行都有不同的学生ID。

在成绩簿中,班级ID位于一个单元格D1中。在母版中,相同的班级ID将与学生ID号(在找到时)位于同一行,但可以根据学生所在的班级,学期和一天中的特定时段而在几个不同的列中。

以下是可能的列:I,N,S,X,AC,AH,AM,AR,AW,BB,BG,BL,BQ,BV,CA,CF,CK,CP,CU,CZ,DE ,DJ,DO,DT,DY,ED,EI,EN,ES,EX,FC,FH,FM,FR,FW。如果我弄乱了该列表,那么它是每隔五列以“ I”开头,以“ FW”结尾。

我的想法是先找到学生所在的行,然后找到班级ID所在的列,然后将信息复制到班级ID之后的下4列。

正如我提到的那样,我的代码可以正常工作,但是在我花所有时间编写请求请求的过程中,脚本仍在运行,因此将超过最大执行时间。哈哈

任何建议都将被接受。 :)

在回复中请具体说明,因为以下代码会加重我的能力,而且我不确定我是否知道如何实施您可能提供的任何解决方案。

function gbToMaster() {

  //get source spreadsheet
  var ss = SpreadsheetApp.openById('16YVy9rC-9g00rem4rfoQdqxgiGNzYD7mucJsO9udPrQ'); //source spreadsheet ID
  var gb = ss.getSheetByName('Grade Book'); //source sheet
  var classID = gb.getRange(2, 4).getValue(); //get the class ID to find in the student data master

  //get the target spreadsheet
  var sdm = SpreadsheetApp.openById('1nYgKwslsX8Tqw9rqbFsVa7q2Itm2RMoeORWjG7LFOyU');
  var sdmt = sdm.getSheetByName('Master Database'); //target sheet student data master target

  // get the last row in the student database master...currently 397
  var lastRow = sdmt.getLastRow();
      Logger.log(lastRow); 

 //Get each student ID from source and check it against the list of student IDs in master to find a match
  for (var si=6; si<104; si++) {

    //get value of student ID
    var studentId = gb.getRange(si,65).getValue();

    //find the row in student database master that contains the student ID
    for(var trow =3; trow < lastRow+1; trow++ ){

      //get target sheet student ID value to compair
      var cellValue = sdmt.getRange(trow,5).getValue();

      //*****Working until this point*****


      if(cellValue == studentId){

        //get all the values we need to transfer
        var gradeNum = gb.getRange(si,74).getValue();
        var behavior = gb.getRange(si,6).getValue(); 
        var missingAssessment = gb.getRange(si,7).getValue();
        var excusedAssessment = gb.getRange(si,60).getValue();

        //search in row to find class id
        for(var tcol=9; tcol<198; tcol++){
          var classIDT = sdmt.getRange(trow, tcol).getValue();

          //check if current classIdTarget matches the key classID
          if(classIDT == classID){

            //copy values from grade book sourse sheet into student data master target
            sdmt.getRange(trow, tcol+1).setValue(gradeNum);
            sdmt.getRange(trow, tcol+2).setValue(behavior);
            sdmt.getRange(trow, tcol+3).setValue(missingAssessment);
            sdmt.getRange(trow, tcol+4).setValue(excusedAssessment);

          }
        }  
      }
     }
   }
} 

0 个答案:

没有答案