Скрипт для автообновления таблицы со статистикой

Готовый шаблон, необходимо только вписать имена игроков (добавив дополнительные строки при необходимости) и выбрать в верхнем меню «Статистика» -> «Обновить данные» (в первый раз потребуется подтверждение на исполнение).

https://drive.google.com/previewtemplate?id=1LMoAGE5J1jkBHwxSd4FmEfp4YgbwFgxpu91npqgfFMY&mode=public

h_1425141908_2238790_4618f194fd.png

Пример:

h_1425141402_5467829_2f1754d26b.png

Исходный код

http://pastebin.com/yMRjxH8j

var dict = {
  data: {
    nickName: "Ник",
    effRating: "Рейтинг эффективности",
    karma: "Карма",
    prestigeBonus: "Мощь флота",
    effRating: "Рейтинг",
    uid: "UID",
    pvp: {
      gamePlayed: "Боев",
      gameWin: "Побед",
      totalAssists: "Помощи",
      totalBattleTime: "Время в бою",
      totalDeath: "Смертей",
      totalDmgDone: "Урона",
      totalHealingDone: "Восстановлено",
      totalKill: "Убийств",
      totalVpDmgDone: "Очков захвата",
    },
    clan:{
      name: "Название корпорации",
      tag: "Тег корпорации"
    }
  }
}

function getHeader(self) {
  var totalBattleTime = self.data.pvp.totalBattleTime;
  /*var ms = totalBattleTime % 1000;
  var s = (totalBattleTime / 1000) % 60;
  var m = ((totalBattleTime / 1000) / 60) % 60;
  var h = (((totalBattleTime / 1000) / 60) / 60) % 24;
  var d = (((totalBattleTime / 1000) / 60) / 60) / 24;*/
  
  return [
    self.data.uid,
    self.data.clan === undefined ? '' : self.data.clan.name + ' [' + self.data.clan.tag + ']',
    self.data.karma === undefined ? 0 : self.data.karma,
    self.data.prestigeBonus === undefined ? 0 : Math.floor(self.data.prestigeBonus * 100),
    self.data.pvp.totalKill,
    self.data.pvp.totalDeath,
    self.data.pvp.totalAssists,
    self.data.pvp.gamePlayed,
    self.data.pvp.gameWin,
    '=CONCATENATE(TEXT(ROUNDDOWN(((('+totalBattleTime.toString()+'/1000)/60)/60)/24);"00");" ";TEXT(ROUNDDOWN(MOD(((('+totalBattleTime.toString()+'/1000)/60)/60);24));"00");":";TEXT(ROUNDDOWN(MOD((('+totalBattleTime.toString()+'/1000)/60);60));"00");":";TEXT(ROUNDDOWN(MOD(('+totalBattleTime.toString()+'/1000);60));"00"))',
    //Math.floor(d.toString())+' дн. '+Math.floor(h.toString())+' ч. '+Math.floor(m.toString())+' мин. '+Math.floor(s.toString())+' сек.',
    '=CONCATENATE(TEXT(ROUNDDOWN(MOD((('+Math.floor((totalBattleTime/self.data.pvp.gamePlayed)).toString()+'/1000)/60);60));"0");":";TEXT(ROUNDDOWN(MOD(('+Math.floor((totalBattleTime/self.data.pvp.gamePlayed)).toString()+'/1000);60));"00"))',
    self.data.pvp.totalDmgDone,
    self.data.pvp.totalHealingDone,
    self.data.pvp.totalVpDmgDone,
    ((self.data.effRating) ? self.data.effRating : 500),
  ];
};

function updateDate(sheet) {
  for (var i = 2; i <= sheet.getLastRow()-4; i++) {
    var nickName = sheet.getRange(i,1).getValue();
    
    var response = UrlFetchApp.fetch("http://gmt.star-conflict.com/pubapi/v1/userinfo.php?nickname="+nickName);
    var json = response.getContentText();
    try {
      var stat = JSON.parse(json);
    } catch (e) {
      Logger.log('Error type: '+e.name+', nickname: ',+nickName)
      continue;
    };
    
    if (stat.result !== "ok" || stat.code !== 0) {
      continue;
    };
    try {
      var header = getHeader(stat);
    } catch(e) {
      continue;
    };
    
    var j = 2;
    for (var key in header) {
      sheet.getRange(i,j).setValue(header[key]);
      j++;
    };
  };
};

function updateDataProtection() {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var sheet = sheets[0]
  var protection = sheet.protect();
  try {
    updateDate(sheet);
  } finally {
    protection.remove();
  };
};

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Обновить данные",
    functionName : "updateDataProtection"
  }];
  spreadsheet.addMenu("Статистика", entries);
};

опа, опа… где-то хранится количество смертей?

Ну вот я знаю свой к/д. 1.5… я нуб. Чет я не очень счастлив(((((((((((

))))))))))))))))))))))))))))))))

Черт возьми, такая классная вещь и потерялась где-то на форуме…

Прикрепите, что-ли в какой-нибудь раздел.

И, да, я не совсем понял смысл вот этого показателя: ((K/D+K/B+(A/D)*0,75+(A/B)*0,75+B/D)/5)*WINRATEx2

Очередной синтетический показатель “крутости”? (K/D килл/дес , К/В - килл/помощь, а А/Д? и 

Поясните, плз)

опа, опа… где-то хранится количество смертей?

Ну вот я знаю свой к/д. 1.5… я нуб. Чет я не очень счастлив(((((((((((

))))))))))))))))))))))))))))))))

Черт возьми, такая классная вещь и потерялась где-то на форуме…

Прикрепите, что-ли в какой-нибудь раздел.

И, да, я не совсем понял смысл вот этого показателя: ((K/D+K/B+(A/D)*0,75+(A/B)*0,75+B/D)/5)*WINRATEx2

Поясните, плз)

Число смертей нигде не хранится, оно вычисляется

Вот [http://forum.star-conflict.ru/index.php?/topic/41459-skolko-raz-menia-podbili-makros-na-vba-pod-microsoft-word/?p=852233](< base_url >/index.php?/topic/41459-skolko-raz-menia-podbili-makros-na-vba-pod-microsoft-word/?p=852233)

В логе игры можно определить по недвусмысленным словам "Killed "  и “killer”

:jersalute:

Я бы согласился, но хм… Логи хранятся в личной папке юзверя, а этот конкретный скрипт я запустил на рабочем компе, на котором в СК не играл. 

И даже не копировал игру. 

Т.е. этот скрипт выдрал данные с сервера.

о.

UPD: И, да, а еще что-то интересное из профиля игрока выцарапать можно?

Например, количество боев в звене/кол-во боев соло. смертей соло, смертей в звене… и  т.д.)

UPD2: А для чего реализована возможность проверить стату сразу 3х пилотов? и посчитать среднее? Хм. утилита для подбора равных по силе в звено? тогда почему не 4 пилота?

 

Я бы согласился, но хм… Логи хранятся в личной папке юзверя, а этот конкретный скрипт я запустил на рабочем компе, на котором в СК не играл. 

И даже не копировал игру. 

Т.е. этот скрипт выдрал данные с сервера.

о.

UPD: И, да, а еще что-то интересное из профиля игрока выцарапать можно?

Например, количество боев в звене/кол-во боев соло. смертей соло, смертей в звене… и  т.д.)

 

 

Я бы согласился, но хм… Логи хранятся в личной папке юзверя, а этот конкретный скрипт я запустил на рабочем компе, на котором в СК не играл. 

И даже не копировал игру. 

Т.е. этот скрипт выдрал данные с сервера.

о.

 

Значит я обшибся =\

Ну если скрипт показывает кол-во смертей с официального сервера, значит пора разработчиков завалить просьбами показывать наконец в послебоевой статистике во вкладке дополнительно кол-во потерянных игроком кораблей. Уже ждва года ждем =)))))))))

Не знаю, mx35097 и IROOT на моей памяти (может кого забыл, простите) к офиц.серверу запросы давали, я локальные логи курил =)

Черт возьми, теперь можно на форуме при попытке меряться письками тыкать в соперника его низким рейтом)))))))

У ары к/д 1.17( а он один из лучших заградоводов сервера и летает в основном на них. беда-печаль(.

Правда помощи куда больше. Или я неправильно ник написал?

Хм… а можно выдрать скриптом стату если не всех, то тех кто отыграл больше 3к боев, и показать распределение по параметрам К/Д, винрейт и т.д…?

У ары к/д 1.17( а он один из лучших заградоводов сервера и летает в основном на них. беда-печаль(.

А у меня 2.3 :fedp: 

Летаю в основном на прихватах и при этом рак… Апните прихватики!)

Ой, а % побед даж больше, чем в танках у меня :-/

K/D     2,67

Убийств/Смертей       2,04

Убийств за бой        3,53

Смертей за бой       1,73

 

я рак )))

Э,… не уловил.

K/D 2.67 (Kill/Death ?)

убийств/смертей 2.04 

?)

 

Это как возможно?)

 

И, да, кончайте размерами меряться, тема не о том.

PS почему нельзя 2 раза + поставить( А, вот, нашел)

Можно проще и легче посмотреть К/д и смерти, без танцев с бубном.  :fedlol:

мой К/Д - 2.78

а у NoConnection 2.04, он видимо ошибся где то. 

Можно хоть сколько угодно внести в таблицу игроков, хоть всю корпорацию и открыть общий доступ по ссылке, нужно только выбрать строку посередине и выбрать «Вставка» -> «Строка выше/ниже» чтобы увеличить увеличить количество строк и не испортить шаблон.

Потом можно сделать чтобы рейтинги автоматически обновлялись. Нужно выбрать в меню «Инструменты» → «Редактор скриптов…»

s_1425854728_9759065_59f4973424.png

Должно получиться что-то типа такого:

s_1425855237_7561852_bce0f3f07f.png

Тогда другой вопрос: чтобы не выковыривать ручками таблицу ников всех игроков с более чем, например, 3 тыс. боев можно что-то сделать? UID какой-то слишком длинный, судя по всему они не по порядку идут…

Тогда другой вопрос: чтобы не выковыривать ручками таблицу ников всех игроков с более чем, например, 3 тыс. боев можно что-то сделать? UID какой-то слишком длинный, судя по всему они не по порядку идут…

Ничего нельзя сделать, нету API для получения списка игроков.

Хм…Есть рейтинги. По идее они где-то хранятся. А API для получения рейтинговых таблиц тож нет?( по идее клиент же как-то их считывает с сервака. 

Наделать скринов, да попробовать в FineReader распознать, что-ли…

Хм…Есть рейтинги. По идее они где-то хранятся. А API для получения рейтинговых таблиц тож нет?( по идее клиент же как-то их считывает с сервака. 

Наделать скринов, да попробовать в FineReader распознать, что-ли…

Публичного API нет, а то как игра получает данные сервера по лицензионному соглашению пользоваться запрещено.

Кроме FineReader можно использовать OpenCV.

Google поменяли интерфейс управления защитой страницы, я этого не сразу заметил, теперь исправил код во втором посте и в шаблоне.

Было:

https://developers.google.com/apps-script/reference/spreadsheet/page-protection

Стало:

https://developers.google.com/apps-script/reference/spreadsheet/protection

спасибо, очень удобно отслеживать динамику развития курсантов Академии …

спасибо, очень удобно отслеживать динамику развития курсантов Академии …

Пожалуйста, рад что люди пользуются, есть для кого стараться.

Добавил обработку исключений в месте где получается JSON строка с сервера и в месте где устанавливается и снимается защита (раньше при ошибки где-то внутри кода этого не происходило) с листа при обновлении. Раньше при ошибке внутри кода защита не снималась. Вообще этот костыль был сделан чтобы записи не дублировались при сортировки во время обновления, а это происходило из-за перезаписи ника, теперь убрал, но защита пусть останется.

del

суть: нужен нормальный API с более подробной и развёрнутой инфой, в т.ч. дампы списков игроков.