VTC_MyPortal_Attendance_Calculator

計算出席率

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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>';
})();