VTC_MyPortal_Attendance_Calculator

計算出席率

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name         VTC_MyPortal_Attendance_Calculator
// @namespace    http://tampermonkey.net/
// @version      2025-5-14
// @description  計算出席率
// @author       GG
// @match        https://myportal.vtc.edu.hk/wps/myportal/sp/spostud/!ut/p/z1/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=edu.hk
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    const array = {};

    // console.log("Hello world");
    var original = document.querySelector("#viewns_Z7_60MAHK02O09VD0QM6ROE6S0000_\\:j_id_1t\\:j_id_2b\\:tbody_element").innerText;
    original = original.replace(/\s+/ig, " ")
    original = original.split(" ");
    // console.log([original])
    var status_present_times = 0
    var attend_time = 0
    var real_hour_time = 0
    var sum_hour_time = 0
    // 傳入 HH:MM 返回 Second
    function format2sec(format_time) {
        // 小時
        let hours = parseInt(format_time.slice(0, 2)) * 3600;
        // 分鐘
        let second = parseInt(format_time.slice(3, 5)) * 60;
        return hours + second;
    }
    var i = 0
    while (i < original.length) {
        // +2 狀態
        // +3 拍卡時間
        if (original[i + 2] == "Present" || original[i + 2] == "Absent" || original[i + 2] == "Late") {
            var timeDf = 0
            // 課堂開始時間
            let st = format2sec(original[i + 4])
            // 課堂結束時間
            let ed = format2sec(original[i + 6])
            sum_hour_time += ed - st
            if (original[i + 3] !== "-") {
                status_present_times += 1
                // 拍卡時間
                let tapCareTime = format2sec(original[i + 3])
                // 如果遲到 按照拍卡時間計算
                if (original[i + 2] === "Late") {
                    timeDf = ed - tapCareTime
                } else {
                    timeDf = ed - st
                }
                real_hour_time += timeDf
                // console.log("拍卡時間:", original[i+3], "上課時間",  original[i+4], "落堂時間:", original[i+6], "出席時數", (timeDf/3600).toFixed(1), "Hours")
            } else if (original[i + 2] === "Absent") {
                // console.log("未出席:", original[i])
            }
        }

        i++
    }
    // 上捨入結果
    var Abs = Math.ceil(100 - ((real_hour_time / 3600).toFixed(2) / (sum_hour_time / 3600).toFixed(2)).toFixed(3) * 100)
    // "<h3 style='color: red'>reference only</h3>"
    document.querySelector("#viewns_Z7_60MAHK02O09VD0QM6ROE6S0000_\\:j_id_1t > div:nth-child(7) > span").innerHTML +=
    "<span><mark>數據僅供參考!/For reference only! ---> "+"Abs(recent):"+ Abs.toString() + "%</mark></span>"
    document.querySelector("#viewns_Z7_60MAHK02O09VD0QM6ROE6S0000_\\:j_id_1t\\:j_id_2b\\:tbody_element").innerHTML += '<tr class="hkvtcsp_trow_color"><td style="text-align:center">>>>></td><td style="text-align:center">'+status_present_times.toString()+'</td><td style="text-align:center">'+(real_hour_time / 3600).toFixed(2).toString()+'Hours</td><td style="text-align:center">'+(sum_hour_time / 3600).toFixed(2).toString()+'Hours</td><td style="text-align:center"><<<<</td></tr>';
})();