您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
In the Snowflake "preview" GUI (September 2021), find the selected view or table, if any, then copy the fully qualified name to the clipboard
// ==UserScript== // @name Snowflake Copy Selected Table Name to Clipboard // @namespace http://tampermonkey.net/ // @version 0.1 // @description In the Snowflake "preview" GUI (September 2021), find the selected view or table, if any, then copy the fully qualified name to the clipboard // @author Zev Averbach // @include /^https?://app\.snowflake\.com/* // @icon https://www.google.com/s2/favicons?domain=tampermonkey.net // @grant none // ==/UserScript== (function() { // observer code from https://stackoverflow.com/a/47406751/4386191 let observer = new MutationObserver(resetTimer); let timer = setTimeout(action, 3000, observer); // wait for the page to stay still for 3 seconds observer.observe(document, {childList: true, subtree: true}); function resetTimer(changes, observer) { clearTimeout(timer); timer = setTimeout(action, 3000, observer); } function action(o) { // find the selected view or table, if any, then copy the fully qualified name to the clipboard o.disconnect(); console.log('script loaded successfully') // hardcoded for the Snowflake "preview" GUI as of September 13 2021 const rows = document.querySelector(".content") .children[0] .children[1] .children[0] .children[0] .children[1] .children[0] .children[2] .children[0] .children[0] .children[0] .children[0] .children[0] .children[0] .children[0] .children[0] .children[0] .children[1] .children const getCurrentlySelectedItem = () => Array.from(rows).filter(row => row.dataset.oeNodeColor === "#1a6ce7")[0] const getLeftPadding = el => window.getComputedStyle(el, null).getPropertyValue("padding-left") const NoneSelected = {} const LEFT_PADDING_TABLE_LEVEL = "68px" const LEFT_PADDING_IGNORE_LEVEL = "48px" const LEFT_PADDING_IGNORE_LEVELS = [LEFT_PADDING_TABLE_LEVEL, LEFT_PADDING_IGNORE_LEVEL] const LEFT_PADDING_SCHEMA_LEVEL = "28px" const getSelectedNameInSql = () => { const selectedElement = getCurrentlySelectedItem() if (!selectedElement) { throw NoneSelected } const tableText = selectedElement.innerText let currentLevel = LEFT_PADDING_TABLE_LEVEL let el = selectedElement while (LEFT_PADDING_IGNORE_LEVELS.includes(currentLevel)) { el = el.previousSibling currentLevel = getLeftPadding(el) } const schemaText = el.innerText while (LEFT_PADDING_IGNORE_LEVELS.concat(LEFT_PADDING_SCHEMA_LEVEL).includes(currentLevel)) { el = el.previousSibling currentLevel = getLeftPadding(el) } const dbText = el.innerText return `${dbText}.${schemaText}.${tableText}` } document.addEventListener("keydown", function(e) { if (e.key === "0" && e.ctrlKey) { const name = getSelectedNameInSql() navigator.clipboard.writeText(name) } }) } })();