True_Seeker / ETIS signs alert

// ==UserScript==
// @name         ETIS signs alert
// @namespace    http://tampermonkey.net/
// @version      0.1
// @copyright    True Seeker, 2019
// @description  Скрипт для уведомления о новых оценках в ЕТИС'е
// @author       True Seeker
// @grant        GM.getValue
// @grant        GM.setValue
// @include      https://student.psu.ru/pls/stu_cus_et/stu.signs?p_mode=current
// @updateURL    https://openuserjs.org/meta/True_Seeker/ETIS_signs_alert.meta.js
// @license      MIT
// ==/UserScript==
( async function() {
    //document.getElementsByTagName("table")[0].getElementsByTagName("td").item(48).innerText = 50042
    var tables, txt, rows,i ,j,savedSign, index;
    if ( await GM.getValue("first") == undefined || await GM.getValue("first") == false ) { //Если человек заходит впервые
        alert("Скрипт начнет работу со следующего посещения этой страницы")
        tables = document.getElementsByTagName("table");

        for(i = 0; i < tables.length; i++){
            rows = tables[i].getElementsByTagName("td");
        }

        console.log("КОЛЧЕСТВО ВСЕХ ТАБЛИЦ " + tables.length);
        console.log("ДАННЫЕ ВСЕХ ПОЛЕЙ ТАБЛИЦ ");
        for(i = 0;i < tables.length; i++){ //Перебор всех таблиц
            rows = tables[i].getElementsByTagName("td");
            for(j = 0;j < (rows.length-4)/9;j++){ //перебор всех строк в текущей таблице
                if(tables[i].getElementsByTagName("td").item(3 + 9*j) != null){
                    txt = tables[i].getElementsByTagName("td").item(3 + 9*j).innerText;
                    index = String(i) + ";" + String(j)
                    GM.setValue(index,txt)
                }
                else{
                    index = String(i) + ";" + String(j)
                    GM.setValue(index,null)
                }
            }
        }
        await GM.setValue("first",true)
    }
    else {
        console.log("Проверка новых оценок")
        tables = document.getElementsByTagName("table");
        for(i = 0;i < tables.length; i++){ //Перебор всех таблиц
            rows = tables[i].getElementsByTagName("td");
            for(j = 0;j < (rows.length-4)/9;j++){ //перебор всех строк в текущей таблице
                savedSign = await GM.getValue(String(i)+";"+String(j))
                if(tables[i].getElementsByTagName("td").item(3 + 9*j).innerText != savedSign){ // проверка совпадения оценки
                    alert("У вас новая оценка");
                    index = String(i) + ";" + String(j)
                    console.log("ИНДЕКС " + index)
                    console.log("НОВЫЙ ЭЛЕМЕНТ " + tables[i].getElementsByTagName("td").item(3 + 9*j).innerText)
                    GM.setValue(index,String(tables[i].getElementsByTagName("td").item(3 + 9*j).innerText))
                }
            }
        }
    }


})();