Застрял в кратком руководстве для разработчиков G Suite, чтобы проверить посещаемость курсов Google Meet. - PullRequest
1 голос
/ 06 мая 2020

Я был бы очень признателен за любой вклад. Спасибо; Я использую G Suite Developer Quickstart для скрипта посещаемости Meet https://developers.google.com/gsuite/add-ons/editors/sheets/quickstart/attendance К сожалению, после использования предоставленного кода и внесения изменений я всегда получаю «Отсутствует» или «Присутствует» для всех учащихся. (независимо от того, присутствовали они или нет) в зависимости от того, использую ли я «null» или «false» в операторе if для действий для applicationName 'meet'. Вот код, который я использую как суперпользователь:

...

    function onOpen() {
      var ui = SpreadsheetApp.getUi();
  ui.createMenu('Opciones SG')
      .addItem("Importar Curso", 'importCourses')
      .addItem('Verificar Asistencia', 'checkAll')
      .addToUi();
} 

    function importCourses() {
  var optionalArgs = {
    teacherId: 'me',
    pageSize: 5
  };
  var response = Classroom.Courses.list();
  var courses = response.courses;
  for (var i = 0; i < 1; i++) {
    var courseName = courses[i].name;
    var courseId = courses[i].id;
    insertCourse(courseName, courseId)
  }
}

function insertCourse(courseName, courseId) {
    var spreadsheetName = courseName + "(" + courseId + ")"
    var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var yourNewSheet = activeSpreadsheet.getSheetByName(spreadsheetName);

    if (yourNewSheet != null) {
        return
    }
    yourNewSheet = activeSpreadsheet.insertSheet();
    yourNewSheet.setName(spreadsheetName);
    yourNewSheet.appendRow(['Nombre', 'Email', 'Asistencia'])
    yourNewSheet.setFrozenRows(1)
    var studentNames = getRoster(courseId)["studentNames"]
    var studentEmails = getRoster(courseId)["studentEmails"]
    for (var i = 0; i < studentNames.length; i++) {
      yourNewSheet.appendRow([studentNames[i],studentEmails[i]])
    }
    yourNewSheet.autoResizeColumns(1, 2)
    yourNewSheet.setFrozenColumns(2)
  }

function getRoster(courseId) {
  var studentNames = []
  var studentEmails = []
  var optionalArgs = {
      pageSize: 100
  };
  var response = Classroom.Courses.Students.list(courseId, optionalArgs)
  var students = response.students

  for (var i = 0; i < 100; i++) {
    try {
      studentNames.push(students[i].profile.name.fullName)
      studentEmails.push(students[i].profile.emailAddress)
    } catch (err) {
       return { "studentNames":studentNames, "studentEmails":studentEmails }
   }
 }
}

function checkAll() {
  var ss = SpreadsheetApp.getActiveSheet();
  var sheet = ss.getDataRange().getValues();
  for (var i = 2; i < sheet.length * 100; i++){
    var meetCode = getCleanCode(sheet[0][i])
    // No Meet code given
    if (meetCode == null) {
      break;
    }
    else {
      // check whether each student was present in Meet
      checkMeet(meetCode, i+1);
    }
  }
}

function checkMeet(meetCode, index) {
  // universal settings - static
  var userKey = 'all';
  var applicationName = 'meet';
  var ss = SpreadsheetApp.getActiveSheet();
  var sheet = ss.getDataRange().getValues();
  for (var i = 0; i < sheet.length-1; i++) {
    var emailAddress = sheet[i+1][1]
    var optionalArgs = {
      event_name: "call_ended",
      filters: "identifier==" + emailAddress + ",meeting_code==" + meetCode
    };
    try {
      var response = AdminReports.Activities.list(userKey, applicationName, optionalArgs);
      var activities = response.items;
      if (activities == false) {
        markAbsent(ss,i+2,index)
      }
      else {
        markPresent(ss,i+2,index)
      }
    } catch (err) {
        continue
     }
  }
}

function getCleanCode(meetCode) {
  try{
    return meetCode.replace("/-/g","")
  } catch (err) { return meetCode; }
}

function markAbsent(sheet, i, j) {
    var cell = sheet.getRange(i, j);
    cell.setValue("Absent");
}

function markPresent(sheet, i, j) {
    var cell = sheet.getRange(i, j);
    cell.setValue("Present");
}

...

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Для правильной работы кода проверьте наличие if (activities == null) или if (activities == undefined) - НЕ if (activities == false)

  • Если нет элементов ответа (то есть элементы не были найдены для с указанным пользователем и кодом встречи) - activities будет undefined, но не false.
  • if (activities == false) никогда не будет выполнено, и если вы его используете - все участники будут отмечены как присутствующие
  • С другой стороны, если activities == undefined по другим причинам - например, из-за того, что вы ввели неправильный код встречи (не забудьте заменить 'Asistencia' действительным кодом встречи), все участники будут отмечены как absent
  • Обратите внимание, что API отчетов имеет некоторую задержку, поэтому не ожидайте получения данных об участии в реальном времени.
  • Если все участники отмечены как absent - возможно, данные еще не распространились, подождите некоторое время и повторите попытку.
  • Убедитесь, что вы передаете правильный код встречи в сценарий. Ваш код встречи должен выглядеть примерно так: xxx-xxxx-xxx.
  • Скрипт должен удалить - для правильной работы. Для этого измените в function getCleanCode(meetCode) строку return meetCode.replace("/-/g","") на return meetCode.replace(/-/g, "");
  • Что касается вопроса в вашем комментарии: здесь вы можете увидеть все доступные Hangouts Meet Audit Activity Events, которые вы можете использовать для фильтрации вместо meeting_code. К сожалению, отметка времени не является одним из возможных параметров запроса.
0 голосов
/ 13 августа 2020

Вот код, который мы используем уже несколько месяцев, без глюков:

    function onOpen() {
      var ui = SpreadsheetApp.getUi();
  ui.createMenu('Asistencia')
      .addItem('Asistencia', 'checkAll')
      .addItem('*Crear*', 'createNewSheets')
      .addToUi();
} 

function createNewSheets() {
  var ss        = SpreadsheetApp.getActiveSpreadsheet();

   // Get the range of cells that store employee data.
  var employeeDataRange = ss.getRangeByName("A:A");

  var employeeObjects = employeeDataRange.getValues();

  var template = ss.getSheetByName('Template');

  for (var i=0; i < employeeObjects.length; i++) {

     // Put the sheet you want to create in a variable
     var sheet = ss.getSheetByName(employeeObjects[i]);

      // Check if the sheet you want to create already exists. If so,
      // log this and loop back. If not, create the new sheet.
        if (sheet) {
           Logger.log("Sheet " + employeeObjects[i] + "already exists");
        } else {
           template.copyTo(ss).setName(employeeObjects[i]);
           }
        }
  return;
}



    function importCourses() {
  var optionalArgs = {
    teacherId: 'me',
    pageSize: 5
  };
  var response = Classroom.Courses.list(optionalArgs);
  var courses = response.courses;
  for (var i = 0; i < 2; i++) {
    var courseName = courses[i].name;
    var courseId = courses[i].id;
    insertCourse(courseName, courseId)
  }
}

function insertCourse(courseName, courseId) {
    var spreadsheetName = courseName + "(" + courseId + ")"
    var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var yourNewSheet = activeSpreadsheet.getSheetByName(spreadsheetName);
  
    if (yourNewSheet != null) {
        return
    }
    yourNewSheet = activeSpreadsheet.insertSheet();
    yourNewSheet.setName(spreadsheetName);
    yourNewSheet.appendRow(['Nombre', 'Email', 'Asistencia'])
    yourNewSheet.setFrozenRows(1)
    var studentNames = getRoster(courseId)["studentNames"]
    var studentEmails = getRoster(courseId)["studentEmails"]
    for (var i = 0; i < studentNames.length; i++) {
      yourNewSheet.appendRow([studentNames[i],studentEmails[i]])
    }
    yourNewSheet.autoResizeColumns(1, 2)
    yourNewSheet.setFrozenColumns(2)
  }

function getRoster(courseId) {
  var studentNames = []
  var studentEmails = []
  var optionalArgs = {
      pageSize: 100
  };
  var response = Classroom.Courses.Students.list(courseId, optionalArgs)
  var students = response.students

  for (var i = 0; i < 100; i++) {
    try {
      studentNames.push(students[i].profile.name.fullName)
      studentEmails.push(students[i].profile.emailAddress)
    } catch (err) {
       return { "studentNames":studentNames, "studentEmails":studentEmails }
   }
 }
}

function checkAll() {
  var ss = SpreadsheetApp.getActiveSheet();
  var sheet = ss.getDataRange().getValues();
  for (var i = 2; i < sheet.length * 100; i++){
    var meetCode = getCleanCode(sheet[0][i])
    // No Meet code given
    if (meetCode == null) {
      break;
    }
    else {
      // check whether each student was present in Meet
      checkMeet(meetCode, i+1);

    }
  }
}

function checkMeet(meetCode, index) {
  // universal settings - static
  var userKey = 'all';
  var applicationName = 'meet';
  var ss = SpreadsheetApp.getActiveSheet();
  var sheet = ss.getDataRange().getValues();

//let today = new Date()
//var staringTime = new Date().toISOString();  
  
//  var DateValue = ss.getRange(1, 1).getValues();
  


  for (var i = 0; i < sheet.length-1; i++) {
    var emailAddress = sheet[i+1][1]
    var optionalArgs = {
      startTime: formatStartDate(),
      event_name: "call_ended",
      filters: "identifier==" + emailAddress + ",meeting_code==" + meetCode

    };
    try {
      var response = AdminReports.Activities.list(userKey, applicationName, optionalArgs);
      var activities = response.items;
      if (activities == undefined) {
        markAbsent(ss,i+2,index)
      }
      else {
        markPresent(ss,i+2,index)
      }
      } catch (err) {
        continue
    }

  }

}

function getCleanCode(meetCode) {
  try{
   return meetCode.replace(/-/g, "");
  } catch (err) { return meetCode; }
}

function markAbsent(sheet, i, j) {
    var cell = sheet.getRange(i, j);
    cell.setValue("A");
}

function markPresent(sheet, i, j) {
    var cell = sheet.getRange(i, j);
    cell.setValue("");
}

function formatStartDate(){
  let date = new Date();

  const offset = date.getTimezoneOffset();

  
  let offsetDate = new Date(date.getTime() - (offset*145*1000));
  return offsetDate.toISOString();
}
...