You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Teams用户脚本无效:粘贴Trac工单链接无法格式化显示

Teams网页版用户脚本:粘贴工单链接无法正确显示格式化内容的解决思路

我需要实现一个功能:将工单系统URL粘贴到其他系统时,无需手动格式化就能显示美观的链接。目前在GitHub上已经有一个生效的用户脚本,可以把<rootURL>/ticket/1234这类链接转换为[#1234](<rootURL>/ticket/1234),并被GitHub正常渲染成带编号的链接。

现在想在Teams中实现同样的功能,Windows版Teams虽然有可编程性,但没找到合适的实现方法,所以改用网页版Teams编写新的用户脚本(如果有Teams原生实现方案也欢迎告知)。

GitHub的消息编辑框是textarea,而Teams使用的是动态更新的div。我编写的粘贴处理函数能创建正确的DOM元素,但执行完成后,Teams消息中仍然显示原始未格式化的URL。日志显示逻辑执行正常,但新创建的DOM元素并未在UI中显示,求解决思路。

以下是我的用户脚本:

// ==UserScript==
// @name         Teams Trac link
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Reformat pasted link to Trac ticket to look pretty in Teams
// @author       Chris Nelson, PE
// @match        https://teams.microsoft.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=microsoft.com
// @grant        none
// ==/UserScript==

// Handle paste event by making custom link, when appropriate.
// If handled, suppress the browser handling of the event.
function handlePaste(event) {
    console.log("Handling paste");
    var target = event.target;

    // Get the text that the user is trying to paste
    var text = (event.clipboardData || window.clipboardData).getData('text');

    try {
        var url = new URL(text);

        if (url.pathname.startsWith('/trac/ticket')) {
            console.log("Pasting a Trac ticket link: " + text);
            var parts = url.pathname.split('/');
            var ticketNumber = parts[3];

            // Don't let the browser also paste
            event.preventDefault();

            // Create a link
            var link = document.createElement('a');
            link.innerHTML = '#' + ticketNumber;
            link.href = text;
            link.title = 'Trac ticket #' + ticketNumber;

            // FIXME - nothing from here on works to insert the link
            // Get all divs
            var divs = Array.from(document.querySelectorAll('div'));
            // Filter to those with an ID that starts 'new-message-' 
            divs = divs.filter(d => d.id.startsWith('new-message-'));

            var parent = divs[0];
            console.log('Before adding, div has ' + parent.childNodes.length + ' children');
            parent.appendChild(link);
            console.log('After adding, div has ' + parent.childNodes.length + ' children');
        }
    }
    catch (error) {
        // Nothing, just let the browser do its thing.
    }
}

(function() {
    console.log("Attaching paste handler");

    // Intercept a paste event anywhere on the page but
    // only handle it if pasting into a new message.
    document.body.addEventListener('paste', (event) => {
        var target = event.target;
        console.log("Got paste event for " + target);

        if (target.tagName.toLowerCase() == 'br'
            && target.dataset.ckeFiller == 'true') {
            handlePaste(event);
        }
    }, false);
})();

内容的提问来源于stack exchange,提问作者Chris Nelson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:45:29