Google+

Sunday, February 5, 2017

Relationship mining в домене Google Suite: извлекаем данные

Если вы - администратор образовательного домена Google Suite, то вам доступна такая замечательная возможность, как анализ отношений между пользователями вашего домена - Relationship Mining.

Как это устроено? Поскольку документы Google хранят все действия с ними, мы можем вытащить из домена все записи - логи, содержащие историю этих записей, а затем на их основе получить картину того, как построено сетевое взаимодействие в нашей организации. Если речь идет о школе, то данные целесообразно извлекать 2 раза в год - перед началом нового учебного года и по итогам первого полугодия. Для этого нам понадобится зайти в панель управления нашего домена и перейти в раздел Отчеты.


Далее заходим в раздел Диск и указываем временной период, за который мы будем извлекать данные. Это лучше делать помесячно, т.е. мы укажем первый и последний день интересующего нас месяца. Следующий важный момент - выбор столбцов (это делается в правом меню службы отчетов). Я обычно извлекаю все, кроме IP.


Через несколько секунд мы получим сообщение о том, что нужная нам таблица сгенерирована.
Теперь нам предстоит самое интересное. Для того, чтобы с нашими данными можно было работать, необходимо отфильтровать то, что нам нужно.

В нашем случае мы будем изучать взаимодействие учителей в домене G Suite. Поэтому нам нужно будет отфильтровать только те записи, которые 
а) Содержат только данные об учителях (а не об учениках)
б) Показывают взаимодействие учителей, а не их действия с собственными документами. В этом нам поможет Google скрипт, код которого мы здесь публикуем.

function cleanData() {
SpreadsheetApp.flush();
var ss = SpreadsheetApp.openById('1B7nsY41C7PeGMwmLQXoaO4kQ0u_mOwFOjfPesuvktyY'); //берем данные из таблицы с логами обращения к G Диску, в скобках подставляем ID таблицы
var s = ss.getSheetByName('Лист1') //в качестве рабочего листа - Лист1. Если в таблице не так, то переименовываем
var ts = SpreadsheetApp.openById('1GCoApFoMep5XuA3PsbpwOtxfNkYhMsixDtlZTuiJM2Q'); //берем аккаунты учителей из таблицы, ID которой указываем
var t = ts.getSheetByName('Лист1');
var all = s.getDataRange().getValues();
var rows = s.getLastRow();
var tall = t.getDataRange().getValues();
var rowst = t.getLastRow();
var w = ss.getSheetByName('TeachersLinks'); //это название пустого листа, который нужно добавить. В него копируются отфильтрованные данные
var tarrow = w.getLastRow();
var testTeachers = [];
var res = [];
for (j = 0; j < rowst; j++)
{
testTeachers.push(tall[j][1]) //Переносим в лист Teacherslinks только те взаимодействия, которые а) совершаются только учителями и б) только с чужими объектами
}
for (i = 1; i < rows; i++)
{
var editor = all[i][2];
var owner = all[i][7];
if (testTeachers.indexOf(editor) !== -1 && testTeachers.indexOf(owner) !== -1 && editor !== owner) //Берем запись в таблице и проверяем а) являются ли оба участника действия (editor и owner) учителями и б) не являются ли они одним и тем же человеком
{
res.push(all[i]);
}
}
res = res.slice(0,100000);
w.getDataRange().clear();
w.getRange(tarrow+2, 1, res.length, res[0].length).setValues(res); //Переносим нужные строки в лист TeachersLinks
}






Подставляем в скрипт ID наших таблиц с данными, запускаем функцию обработки CleanData и в лист TeachersLinks этой же таблицы будут перенесены только те записи, которые нас интересуют. Удалим из таблицы все столбцы кроме столбца с учетными записями редакторов (обычно это столбец B) и авторов документа (G). Озаглавим первый столбец с данными (редактор документа) source, а второй столбец (владелец документа) - target. После этого сохраним наш лист с данными как csv файл. Теперь их можно обрабатывать!