您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
在线表格增强插件
// ==UserScript== // @name 在线表格增强功能 // @namespace http://tampermonkey.net/ // @version 1.3.6 // @description 在线表格增强插件 // @author pianpianluoye // @include *://*suip.*.com/sctj* // @include *://*intuat.*.com/ibss* // @include *://10.249.160.144/sctj* // @icon https://www.google.com/s2/favicons?sz=64&domain=sinopec.com // @grant none // @run-at document-end // @license AGPL-3.0-or-later // ==/UserScript== (function() { 'use strict'; const lockColor = "#f0f3fb" const unlockColor = "#fff" const container = "gc-container" const containerCls = "js-spread-container" const containerDesign = "gc-designer-container" const containerDesignCls = "designer-container" let isDesigner = false let oldColor = [] const cssText = ` /* 按钮样式 */ .tm-btn { display: inline-block; padding: 6px 12px; font-size: 12px; font-weight: 400; line-height: 1; text-align: center; white-space: nowrap; vertical-align: middle; cursor: pointer; user-select: none; background-color: #1890ff; border: 1px solid #1890ff; color: #fff; border-radius: 4px; transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); } .tm-btn:hover { background-color: #40a9ff; border-color: #40a9ff; } /* 模态框样式 */ .tm-modal { display: none; position: fixed; z-index: 9999; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 80%; max-width: 960px; } .tm-modal-content { background-color: #fff; padding: 12px; border: 1px solid #e8e8e8; border-radius: 4px; box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.05); position: relative; } .tm-modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; cursor: move; } .tm-modal-title { margin: 0; font-size: 14px; font-weight: 500; color: rgba(0, 0, 0, 0.85); } .tm-modal-close { font-size: 20px; font-weight: 700; line-height: 1; color: #000; text-shadow: 0 1px 0 #fff; opacity: 0.5; cursor: pointer; transition: all 0.3s; } .tm-modal-close:hover { opacity: 0.8; } /* 表格样式 */ .tm-table-container { max-height: 300px; overflow-y: auto; position: relative; } .tm-table { width: 100%; border-collapse: collapse; table-layout: auto; } .tm-table thead { position: sticky; top: 0; background-color: #fafafa; z-index: 1; } .tm-table th, .tm-table td { padding: 8px 12px; border-bottom: 1px solid #e8e8e8; text-align: left; font-size: 12px; color: rgba(0, 0, 0, 0.85); white-space: nowrap; position: relative; } .tm-table th { font-weight: 500; } /* 鼠标经过行的效果 */ .tm-table tbody tr:hover { background-color: #e6f7ff; } /* 选中行的效果 */ .tm-table tbody tr.selected { background-color: #bae7ff; } /* 模态框底部按钮样式 */ .tm-modal-footer { display: flex; justify-content: flex-end; margin-top: 10px; } .tm-modal-footer .tm-btn { margin-left: 8px; } .tm-btn-secondary { background-color: #fff; border-color: #d9d9d9; color: rgba(0, 0, 0, 0.85); } .tm-btn-secondary:hover { background-color: #fff; border-color: #40a9ff; color: #40a9ff; } /* 复制图标样式 */ .tm-copy-icon { display: none; position: absolute; right: 10px; top: 50%; transform: translateY(-50%); cursor: pointer; } .tm-table td:hover .tm-copy-icon { display: inline-block; } /* 公式单元格样式,超出宽度显示省略号 */ .tm-formula-cell { max-width: 150px; /* 可根据需要调整最大宽度 */ overflow: hidden; text-overflow: ellipsis; } /* 列宽拖动条样式 */ .tm-resize-handle { position: absolute; top: 0; right: 0; width: 5px; height: 100%; cursor: col-resize; } ` const msg = ` <div class="ant-message-notice"> <div class="ant-message-notice-content"> <div class="ant-message-custom-content ant-message-success"> <i aria-label="icon: check-circle" class="anticon anticon-check-circle"> <svg viewBox="64 64 896 896" data-icon="check-circle" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class=""> <path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 0 1-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z"></path> </svg> </i> <span>右键菜单开启</span> </div> </div> </div> ` const myStyle = document.createElement("style"); myStyle.textContent = cssText; document.head.appendChild(myStyle) let addCount = 1 const enumTypes = { 0:"任何值", 1:"整数", 2:"小数", 3:"序列", 4:"日期", 5:"时间", 6:"文本长度", 7:"自定义" } const enumOperators = { 0:"等于", 1:"不等于", 2:"大于", 3:"大于等于", 4:"小于", 5:"小于等于", 6:"介于", 7:"未介于" } const enumErrorStyle = { 0:"停止", 1:"警告", 2:"信息" } const enumHighlightType = { 0:"圆圈", 1:"折角", 2:"图标" } const enumTrueFalse = { true:"是", false:"否" } const btnplugin = document.createElement("span"); btnplugin.classList.add("ant-dropdown-trigger"); btnplugin.classList.add("action"); btnplugin.innerHTML = ` <i class="anticon"> <svg width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class=""> <use xlink:href="#iconsetting"></use> </svg> </i>`; const originalMount = Vue.prototype.$mount; Vue.prototype.$mount = function() { const result = originalMount.apply(this, arguments); handleVueInstance(this); return result; }; function handleVueInstance(vm) { vm.$watch('spreadViewer', (newVal) => { if(!isDesigner){ window.GlobalSpViewer = newVal addCustomMenu(newVal.spread) } }); vm.$watch('spread', (newVal) => { if(!isDesigner){ window.GlobalSp = newVal // addCustomMenu(newVal.spread) // spreadGlobalConfig() // bindNewRowUnlockCell() } }); vm.$watch('instance', (newVal) => { window.GlobalWps = newVal addWpsCustomButton() }); vm.$watch('record', (newVal) => { window.GlobalReportForm = newVal }); } /* begin:WPS */ async function addWpsCustomButton() { await GlobalWps.ready(); const app = GlobalWps.Application; const controls = await app.CommandBars('ToolsTab').Controls; const controlButton = await controls.Add(10); controlButton.Caption = '辅助功能'; controlButton.Picture = 'data:image/svg+xml;base64,PHN2ZyB0PSIxNzQzNjcyODk2MzMyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjM4NDQ4IiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+PHBhdGggZD0iTTkxMy40MDggMTIyLjg4IDEwOC41NDQgMTIyLjg4bDAgMEM5MC4xMTIgMTIyLjg4IDczLjcyOCAxMzcuMjE2IDczLjcyOCAxNTUuNjQ4TDczLjcyOCA4NjAuMTZsMCAwYzAgMTguNDMyIDE0LjMzNiAzNC44MTYgMzQuODE2IDM0LjgxNmw4MDQuODY0IDAgMCAwYzE4LjQzMiAwIDMyLjc2OC0xNC4zMzYgMzIuNzY4LTM0LjgxNkw5NDYuMTc2IDE1Ny42OTZsMCAwQzk0Ni4xNzYgMTM3LjIxNiA5MzEuODQgMTIyLjg4IDkxMy40MDggMTIyLjg4ek04ODAuNjQgODI3LjM5MiAxNDEuMzEyIDgyNy4zOTIgMTQxLjMxMiAzNjguNjQgODgwLjY0IDM2OC42NCA4ODAuNjQgODI3LjM5MnpNODgwLjY0IDMyOS43MjggMTQxLjMxMiAzMjkuNzI4IDE0MS4zMTIgMTkwLjQ2NCA4ODAuNjQgMTkwLjQ2NCA4ODAuNjQgMzI5LjcyOHoiIHAtaWQ9IjM4NDQ5Ij48L3BhdGg+PHBhdGggZD0iTTMwNS4xNTIgNTQ2LjgxNiAzMDUuMTUyIDU0Ni44MTZjOC4xOTIgNC4wOTYgMTAuMjQgMTQuMzM2IDYuMTQ0IDIyLjUyOC00LjA5NiA4LjE5Mi0xNC4zMzYgMTAuMjQtMjIuNTI4IDYuMTQ0bC0xMTguNzg0LTY3LjU4NEMxNjMuODQgNTAzLjgwOCAxNTkuNzQ0IDQ5My41NjggMTYzLjg0IDQ4NS4zNzZjMi4wNDgtMi4wNDggNC4wOTYtNC4wOTYgNi4xNDQtNi4xNDRsMTE4Ljc4NC02NS41MzZjOC4xOTItNC4wOTYgMTguNDMyLTIuMDQ4IDIyLjUyOCA2LjE0NCA0LjA5NiA4LjE5MiAyLjA0OCAxOC40MzItNi4xNDQgMjIuNTI4bC05NC4yMDggNTMuMjQ4TDMwNS4xNTIgNTQ2LjgxNiAzMDUuMTUyIDU0Ni44MTZ6IiBwLWlkPSIzODQ1MCI+PC9wYXRoPjxwYXRoIGQ9Ik00MzYuMjI0IDM4OS4xMiA0MzYuMjI0IDM4OS4xMmM0LjA5Ni04LjE5MiAxNC4zMzYtMTIuMjg4IDIyLjUyOC04LjE5MiA4LjE5MiA0LjA5NiAxMi4yODggMTQuMzM2IDguMTkyIDIyLjUyOGwtOTIuMTYgMTk0LjU2Yy00LjA5NiA4LjE5Mi0xNC4zMzYgMTIuMjg4LTIyLjUyOCA4LjE5Mi04LjE5Mi00LjA5Ni0xMi4yODgtMTQuMzM2LTguMTkyLTIyLjUyOEw0MzYuMjI0IDM4OS4xMiA0MzYuMjI0IDM4OS4xMnoiIHAtaWQ9IjM4NDUxIj48L3BhdGg+PHBhdGggZD0iTTgyNy4zOTIgMjI1LjI4IDgyNy4zOTIgMjI1LjI4YzE4LjQzMiAwIDMyLjc2OCAxNC4zMzYgMzIuNzY4IDMyLjc2OCAwIDE4LjQzMi0xNC4zMzYgMzIuNzY4LTMyLjc2OCAzMi43NjgtMTguNDMyIDAtMzIuNzY4LTE0LjMzNi0zMi43NjgtMzIuNzY4Qzc5NC42MjQgMjQxLjY2NCA4MDguOTYgMjI1LjI4IDgyNy4zOTIgMjI1LjI4TDgyNy4zOTIgMjI1LjI4eiIgcC1pZD0iMzg0NTIiPjwvcGF0aD48cGF0aCBkPSJNNzQ1LjQ3MiAyMjUuMjggNzQ1LjQ3MiAyMjUuMjhjMTguNDMyIDAgMzIuNzY4IDE0LjMzNiAzMi43NjggMzIuNzY4IDAgMTguNDMyLTE0LjMzNiAzMi43NjgtMzIuNzY4IDMyLjc2OC0xOC40MzIgMC0zMi43NjgtMTQuMzM2LTMyLjc2OC0zMi43NjhDNzEwLjY1NiAyNDEuNjY0IDcyNy4wNCAyMjUuMjggNzQ1LjQ3MiAyMjUuMjhMNzQ1LjQ3MiAyMjUuMjh6IiBwLWlkPSIzODQ1MyI+PC9wYXRoPjxwYXRoIGQ9Ik02NjMuNTUyIDIyNS4yOCA2NjMuNTUyIDIyNS4yOGMxOC40MzIgMCAzMi43NjggMTQuMzM2IDMyLjc2OCAzMi43NjggMCAxOC40MzItMTQuMzM2IDMyLjc2OC0zMi43NjggMzIuNzY4LTE4LjQzMiAwLTMyLjc2OC0xNC4zMzYtMzIuNzY4LTMyLjc2OEM2MjguNzM2IDI0MS42NjQgNjQ1LjEyIDIyNS4yOCA2NjMuNTUyIDIyNS4yOEw2NjMuNTUyIDIyNS4yOHoiIHAtaWQ9IjM4NDU0Ij48L3BhdGg+PHBhdGggZD0iTTc3MC4wNDggODM3LjYzMmMwLTguMTkyIDYuMTQ0LTE0LjMzNiAxNC4zMzYtMTQuMzM2IDguMTkyIDAgMTQuMzM2IDYuMTQ0IDE0LjMzNiAxNC4zMzZsMCAzNi44NjRjMCA4LjE5Mi02LjE0NCAxNC4zMzYtMTQuMzM2IDE0LjMzNmwtMi4wNDggMC02MS40NCAwYy04LjE5MiAwLTE0LjMzNi02LjE0NC0xNC4zMzYtMTQuMzM2bDAgMCAwLTI0LjU3NmMtNC4wOTYtMi4wNDgtOC4xOTItMi4wNDgtMTIuMjg4LTQuMDk2bDAgMCAwIDBjLTQuMDk2LTIuMDQ4LTguMTkyLTQuMDk2LTEyLjI4OC02LjE0NGwtMTguNDMyIDE4LjQzMmMtNi4xNDQgNi4xNDQtMTQuMzM2IDYuMTQ0LTIwLjQ4IDBsMCAwIDAgMC00NS4wNTYtNDUuMDU2Yy02LjE0NC02LjE0NC02LjE0NC0xNC4zMzYgMC0yMC40OGwxOC40MzItMTguNDMyYy0yLjA0OC00LjA5Ni00LjA5Ni04LjE5Mi02LjE0NC0xMi4yODgtMi4wNDgtNC4wOTYtNC4wOTYtOC4xOTItNC4wOTYtMTIuMjg4bC0yNC41NzYgMGMtOC4xOTIgMC0xNC4zMzYtNi4xNDQtMTQuMzM2LTE0LjMzNmwwLTIuMDQ4IDAtNjEuNDRjMC04LjE5MiA2LjE0NC0xNC4zMzYgMTQuMzM2LTE0LjMzNmwwIDAgMjQuNTc2IDBjMi4wNDgtNC4wOTYgMi4wNDgtOC4xOTIgNC4wOTYtMTIuMjg4IDIuMDQ4LTQuMDk2IDQuMDk2LTguMTkyIDYuMTQ0LTEyLjI4OEw1OTguMDE2IDYxNC40Yy02LjE0NC02LjE0NC02LjE0NC0xNC4zMzYgMC0yMC40OGwwIDAgMCAwIDQ1LjA1Ni00NS4wNTZjNi4xNDQtNi4xNDQgMTQuMzM2LTYuMTQ0IDIwLjQ4IDBsMTguNDMyIDE4LjQzMmM0LjA5Ni0yLjA0OCA4LjE5Mi00LjA5NiAxMi4yODgtNi4xNDRsMCAwYzQuMDk2LTIuMDQ4IDguMTkyLTIuMDQ4IDEyLjI4OC00LjA5Nkw3MDYuNTYgNTMyLjQ4YzAtOC4xOTIgNi4xNDQtMTQuMzM2IDE0LjMzNi0xNC4zMzZsMCAwIDYzLjQ4OCAwYzguMTkyIDAgMTQuMzM2IDYuMTQ0IDE0LjMzNiAxNC4zMzZsMCAwIDAgMjQuNTc2YzQuMDk2IDIuMDQ4IDguMTkyIDIuMDQ4IDEyLjI4OCA0LjA5NiA0LjA5NiAyLjA0OCA4LjE5MiA0LjA5NiAxMi4yODggNi4xNDRsMTguNDMyLTE4LjQzMmM2LjE0NC02LjE0NCAxNC4zMzYtNi4xNDQgMjAuNDggMGwwIDAgMCAwIDQ1LjA1NiA0NS4wNTZjNi4xNDQgNi4xNDQgNi4xNDQgMTQuMzM2IDAgMjAuNDhsLTE4LjQzMiAxOC40MzJjMi4wNDggNC4wOTYgNC4wOTYgOC4xOTIgNi4xNDQgMTIuMjg4IDIuMDQ4IDQuMDk2IDQuMDk2IDguMTkyIDQuMDk2IDEyLjI4OEw5MjEuNiA2NTcuNDA4YzguMTkyIDAgMTQuMzM2IDYuMTQ0IDE0LjMzNiAxNC4zMzZsMCAyLjA0OCAwIDYxLjQ0YzAgOC4xOTItNi4xNDQgMTQuMzM2LTE0LjMzNiAxNC4zMzZsLTM0LjgxNiAwYy04LjE5MiAwLTE0LjMzNi02LjE0NC0xNC4zMzYtMTQuMzM2IDAtOC4xOTIgNi4xNDQtMTQuMzM2IDE0LjMzNi0xNC4zMzZsMjIuNTI4IDAgMC0zNC44MTYtMjIuNTI4IDBjLTYuMTQ0IDAtMTIuMjg4LTQuMDk2LTE0LjMzNi0xMC4yNC0yLjA0OC02LjE0NC00LjA5Ni0xMi4yODgtNi4xNDQtMTguNDMyLTIuMDQ4LTYuMTQ0LTYuMTQ0LTEyLjI4OC04LjE5Mi0xNi4zODQtNC4wOTYtNi4xNDQtMi4wNDgtMTIuMjg4IDIuMDQ4LTE4LjQzMmwxNC4zMzYtMTQuMzM2LTI0LjU3Ni0yNC41NzYtMTQuMzM2IDE0LjMzNmMtNC4wOTYgNC4wOTYtMTIuMjg4IDYuMTQ0LTE4LjQzMiAyLjA0OC02LjE0NC00LjA5Ni0xMi4yODgtNi4xNDQtMTguNDMyLTguMTkyLTYuMTQ0LTIuMDQ4LTEyLjI4OC00LjA5Ni0xOC40MzItNi4xNDQtNi4xNDQtMi4wNDgtMTIuMjg4LTYuMTQ0LTEyLjI4OC0xNC4zMzZsMC0yMi41MjgtMzQuODE2IDAgMCAyMi41MjhjMCA2LjE0NC00LjA5NiAxMi4yODgtMTAuMjQgMTQuMzM2LTYuMTQ0IDIuMDQ4LTEyLjI4OCA0LjA5Ni0xOC40MzIgNi4xNDRsMCAwYy02LjE0NCAyLjA0OC0xMi4yODggNi4xNDQtMTguNDMyIDguMTkyLTYuMTQ0IDQuMDk2LTEyLjI4OCAyLjA0OC0xOC40MzItMi4wNDhsLTE0LjMzNi0xNC4zMzYtMjQuNTc2IDI0LjU3NiAxNC4zMzYgMTQuMzM2YzYuMTQ0IDQuMDk2IDYuMTQ0IDEyLjI4OCAyLjA0OCAxOC40MzItNC4wOTYgNi4xNDQtNi4xNDQgMTIuMjg4LTguMTkyIDE4LjQzMi0yLjA0OCA2LjE0NC00LjA5NiAxMi4yODgtNi4xNDQgMTguNDMyLTIuMDQ4IDYuMTQ0LTYuMTQ0IDEyLjI4OC0xNC4zMzYgMTIuMjg4bC0yMi41MjggMCAwIDM0LjgxNiAyMi41MjggMGM2LjE0NCAwIDEyLjI4OCA0LjA5NiAxNC4zMzYgMTAuMjQgMi4wNDggNi4xNDQgNC4wOTYgMTIuMjg4IDYuMTQ0IDE4LjQzMiAyLjA0OCA2LjE0NCA2LjE0NCAxMi4yODggOC4xOTIgMTguNDMyIDQuMDk2IDYuMTQ0IDIuMDQ4IDEyLjI4OC0yLjA0OCAxOC40MzJsLTE2LjM4NCAxNi4zODQgMjQuNTc2IDI0LjU3NiAxNC4zMzYtMTQuMzM2YzQuMDk2LTYuMTQ0IDEyLjI4OC02LjE0NCAxOC40MzItMi4wNDggNi4xNDQgNC4wOTYgMTIuMjg4IDYuMTQ0IDE4LjQzMiA4LjE5MmwwIDBjNi4xNDQgMi4wNDggMTIuMjg4IDQuMDk2IDE4LjQzMiA2LjE0NCA2LjE0NCAyLjA0OCAxMi4yODggNi4xNDQgMTIuMjg4IDE0LjMzNkw3MzMuMTg0IDg2MC4xNmwzNC44MTYgMEw3NjggODM3LjYzMiA3NzAuMDQ4IDgzNy42MzJ6TTc1MS42MTYgNjA4LjI1NiA3NTEuNjE2IDYwOC4yNTZjMzguOTEyIDAgNzMuNzI4IDI0LjU3NiA4OC4wNjQgNTkuMzkyIDQuMDk2IDEyLjI4OCA4LjE5MiAyNC41NzYgOC4xOTIgMzYuODY0IDAgMTIuMjg4LTIuMDQ4IDI0LjU3Ni04LjE5MiAzNi44NjRsMCAwYy0yLjA0OCA2LjE0NC02LjE0NCAxNC4zMzYtMTAuMjQgMjAuNDhsNjEuNDQgNjEuNDRjNi4xNDQgNi4xNDQgNi4xNDQgMTQuMzM2IDAgMjAuNDgtNi4xNDQgNi4xNDQtMTQuMzM2IDYuMTQ0LTIwLjQ4IDBsLTYxLjQ0LTYxLjQ0Yy02LjE0NCA0LjA5Ni0xMi4yODggOC4xOTItMjAuNDggMTIuMjg4LTEyLjI4OCA0LjA5Ni0yNC41NzYgOC4xOTItMzYuODY0IDguMTkyLTEyLjI4OCAwLTI0LjU3Ni0yLjA0OC0zNi44NjQtOC4xOTJsMCAwYy0xMi4yODgtNC4wOTYtMjIuNTI4LTEyLjI4OC0zMC43Mi0yMC40OC0xOC40MzItMTguNDMyLTI4LjY3Mi00My4wMDgtMjguNjcyLTY3LjU4NCAwLTEyLjI4OCAyLjA0OC0yNC41NzYgOC4xOTItMzYuODY0bDAgMGM0LjA5Ni0xMi4yODggMTIuMjg4LTIyLjUyOCAyMC40OC0zMC43MkM3MDIuNDY0IDYxNi40NDggNzI3LjA0IDYwOC4yNTYgNzUxLjYxNiA2MDguMjU2TDc1MS42MTYgNjA4LjI1NnpNNzUxLjYxNiA2MzQuODggNzUxLjYxNiA2MzQuODhjLTE4LjQzMiAwLTM0LjgxNiA2LjE0NC00Ny4xMDQgMjAuNDgtNi4xNDQgNi4xNDQtMTAuMjQgMTIuMjg4LTE0LjMzNiAyMC40OGwwIDBjLTQuMDk2IDguMTkyLTQuMDk2IDE2LjM4NC00LjA5NiAyNi42MjQgMCAyNi42MjQgMTYuMzg0IDUxLjIgNDAuOTYgNjEuNDRsMCAwYzguMTkyIDQuMDk2IDE2LjM4NCA2LjE0NCAyNi42MjQgNi4xNDQgMTAuMjQgMCAxOC40MzItMi4wNDggMjYuNjI0LTYuMTQ0bDAgMGMyNC41NzYtMTAuMjQgNDAuOTYtMzQuODE2IDQwLjk2LTYxLjQ0IDAtOC4xOTItMi4wNDgtMTguNDMyLTQuMDk2LTI2LjYyNGwwIDBDODAyLjgxNiA2NTEuMjY0IDc3OC4yNCA2MzQuODggNzUxLjYxNiA2MzQuODhMNzUxLjYxNiA2MzQuODh6IiBwLWlkPSIzODQ1NSI+PC9wYXRoPjwvc3ZnPg=='; const popupControls = await controlButton.Controls; let enabledStatus = false //开启/禁用更多菜单 const MoreMenus = await app.CommandBars('MoreMenus'); enabledStatus = await MoreMenus.Enabled const btnMoreMenus = await popupControls.Add(1); btnMoreMenus.Caption = enabledStatus ? '更多(禁用)': '更多(启用)'; btnMoreMenus.Picture = 'data:image/svg+xml;base64,PHN2ZyB0PSIxNzQzNjYwOTE0NzYzIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjYxMTUiIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4Ij48cGF0aCBkPSJNODYwIDE5MkgxNjRhNCA0IDAgMCAwLTQgNHY2NGE0IDQgMCAwIDAgNCA0aDY5NmE0IDQgMCAwIDAgNC00di02NGE0IDQgMCAwIDAtNC00eiBtMCAyODRIMTY0YTQgNCAwIDAgMC00IDR2NjRhNCA0IDAgMCAwIDQgNGg2OTZhNCA0IDAgMCAwIDQtNHYtNjRhNCA0IDAgMCAwLTQtNHogbTAgMjg0SDE2NGE0IDQgMCAwIDAtNCA0djY0YTQgNCAwIDAgMCA0IDRoNjk2YTQgNCAwIDAgMCA0LTR2LTY0YTQgNCAwIDAgMC00LTR6IiBwLWlkPSI2MTE2Ij48L3BhdGg+PC9zdmc+'; btnMoreMenus.OnAction = async function(){ enabledStatus = await MoreMenus.Enabled MoreMenus.Enabled = !enabledStatus; if(enabledStatus){ btnMoreMenus.Caption = '更多(启用)'; }else{ btnMoreMenus.Caption = '更多(禁用)'; } } //开启/禁用限制编辑 const RestrictEdit = await app.CommandBars('RestrictEdit'); enabledStatus = await RestrictEdit.Enabled const btnRestrictEdit = await popupControls.Add(1); RestrictEdit.Visible = true btnRestrictEdit.Caption = enabledStatus ? '限制编辑(禁用)' : '限制编辑(启用)'; btnRestrictEdit.Picture = 'data:image/svg+xml;base64,PHN2ZyB0PSIxNzQzNjcyODMzMjk1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjM0NjI4IiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+PHBhdGggZD0iTTUxMC41Nzc3NzggMGMtMTIuOCAwLTI1LjYgNC4yNjY2NjctMzYuOTc3Nzc4IDExLjM3Nzc3OEM0NzAuNzU1NTU2IDEyLjggMzkyLjUzMzMzMyA5NS4yODg4ODkgMzE1LjczMzMzMyAxMTMuNzc3Nzc4Yy00OS43Nzc3NzggMTIuOC0xMDUuMjQ0NDQ0IDE0LjIyMjIyMi0xMzIuMjY2NjY3IDE0LjIyMjIyMi0xNy4wNjY2NjcgMC0yNy4wMjIyMjIgMC0yOC40NDQ0NDQgMC0xLjQyMjIyMiAwLTIuODQ0NDQ0IDAtNC4yNjY2NjcgMC0xNy4wNjY2NjcgMC0zMi43MTExMTEgNS42ODg4ODktNDUuNTExMTExIDE3LjA2NjY2N0M5Mi40NDQ0NDQgMTU2LjQ0NDQ0NCA4NS4zMzMzMzMgMTczLjUxMTExMSA4NS4zMzMzMzMgMTkwLjU3Nzc3OGwwIDE2MC43MTExMTFjMCA1OTMuMDY2NjY3IDM5Ni44IDY2OC40NDQ0NDQgNDEzLjg2NjY2NyA2NzEuMjg4ODg5IDQuMjY2NjY3IDAgNy4xMTExMTEgMS40MjIyMjIgMTEuMzc3Nzc4IDEuNDIyMjIyIDQuMjY2NjY3IDAgNy4xMTExMTEgMCAxMS4zNzc3NzgtMS40MjIyMjJDNTM5LjAyMjIyMiAxMDE5LjczMzMzMyA5MzguNjY2NjY3IDk0NC4zNTU1NTYgOTM4LjY2NjY2NyAzNTEuMjg4ODg5TDkzOC42NjY2NjcgMTkwLjU3Nzc3OGMwLTE3LjA2NjY2Ny03LjExMTExMS0zNC4xMzMzMzMtMjEuMzMzMzMzLTQ2LjkzMzMzMy0xMi44LTExLjM3Nzc3OC0yOC40NDQ0NDQtMTcuMDY2NjY3LTQ0LjA4ODg4OS0xNy4wNjY2NjctMS40MjIyMjIgMC0yLjg0NDQ0NCAwLTQuMjY2NjY3IDAtMS40MjIyMjIgMC0xMS4zNzc3NzggMC0yOC40NDQ0NDQgMC0yNy4wMjIyMjIgMC04MS4wNjY2NjctMS40MjIyMjItMTMwLjg0NDQ0NC0xNC4yMjIyMjJDNjQ0LjI2NjY2NyA5OC4xMzMzMzMgNTY4Ljg4ODg4OSAyNS42IDU0Ny41NTU1NTYgMTEuMzc3Nzc4IDUzNi4xNzc3NzggNC4yNjY2NjcgNTIzLjM3Nzc3OCAwIDUxMC41Nzc3NzggMEw1MTAuNTc3Nzc4IDB6IiBmaWxsPSIjRkZDQzIyIiBwLWlkPSIzNDYyOSI+PC9wYXRoPjxwYXRoIGQ9Ik02NDIuODQ0NDQ0IDM1NS41NTU1NTZjLTkuOTU1NTU2IDIuODQ0NDQ0LTE4LjQ4ODg4OS0yLjg0NDQ0NC0yMS4zMzMzMzMtMTIuOGwtNy4xMTExMTEtMjkuODY2NjY3QzU5Ny4zMzMzMzMgMjU2IDU0NC43MTExMTEgMjIxLjg2NjY2NyA0ODMuNTU1NTU2IDIzNy41MTExMTFjLTYxLjE1NTU1NiAxNS42NDQ0NDQtODguMTc3Nzc4IDcyLjUzMzMzMy03Mi41MzMzMzMgMTI5LjQyMjIyMmwxMS4zNzc3NzggNTIuNjIyMjIyYzIuODQ0NDQ0IDguNTMzMzMzLTIuODQ0NDQ0IDE4LjQ4ODg4OS0xMi44IDIxLjMzMzMzMy05Ljk1NTU1NiAyLjg0NDQ0NC0xOC40ODg4ODktMi44NDQ0NDQtMjEuMzMzMzMzLTEyLjhsLTExLjM3Nzc3OC01Mi42MjIyMjJjLTE5LjkxMTExMS03NS4zNzc3NzggMTcuMDY2NjY3LTE1MC43NTU1NTYgOTguMTMzMzMzLTE3Mi4wODg4ODkgNzkuNjQ0NDQ0LTIxLjMzMzMzMyAxNTIuMTc3Nzc4IDI0LjE3Nzc3OCAxNzMuNTExMTExIDEwMC45Nzc3NzhsNy4xMTExMTEgMjkuODY2NjY3QzY1Ny4wNjY2NjcgMzQyLjc1NTU1NiA2NTEuMzc3Nzc4IDM1Mi43MTExMTEgNjQyLjg0NDQ0NCAzNTUuNTU1NTU2eiIgZmlsbD0iI0ZGRkZGRiIgcC1pZD0iMzQ2MzAiPjwvcGF0aD48cGF0aCBkPSJNNjY5Ljg2NjY2NyA3NTMuNzc3Nzc4IDM1NC4xMzMzMzMgNzUzLjc3Nzc3OGMtMzguNCAwLTY5LjY4ODg4OS0zMS4yODg4ODktNjkuNjg4ODg5LTY5LjY4ODg4OUwyODQuNDQ0NDQ0IDQ3Ni40NDQ0NDRjMC0zOC40IDMxLjI4ODg4OS02OS42ODg4ODkgNjkuNjg4ODg5LTY5LjY4ODg4OWwzMTUuNzMzMzMzIDBjMzguNCAwIDY5LjY4ODg4OSAzMS4yODg4ODkgNjkuNjg4ODg5IDY5LjY4ODg4OWwwIDIwNy42NDQ0NDRDNzM5LjU1NTU1NiA3MjIuNDg4ODg5IDcwOC4yNjY2NjcgNzUzLjc3Nzc3OCA2NjkuODY2NjY3IDc1My43Nzc3Nzh6TTM1NC4xMzMzMzMgNDQyLjMxMTExMWMtMTkuOTExMTExIDAtMzUuNTU1NTU2IDE1LjY0NDQ0NC0zNS41NTU1NTYgMzQuMTMzMzMzbDAgMjA3LjY0NDQ0NGMwIDE4LjQ4ODg4OSAxNS42NDQ0NDQgMzQuMTMzMzMzIDM1LjU1NTU1NiAzNC4xMzMzMzNsMzE1LjczMzMzMyAwYzE5LjkxMTExMSAwIDM1LjU1NTU1Ni0xNS42NDQ0NDQgMzUuNTU1NTU2LTM0LjEzMzMzM0w3MDUuNDIyMjIyIDQ3Ni40NDQ0NDRjMC0xOC40ODg4ODktMTUuNjQ0NDQ0LTM0LjEzMzMzMy0zNS41NTU1NTYtMzQuMTMzMzMzTDM1NC4xMzMzMzMgNDQyLjMxMTExMXoiIGZpbGw9IiNGRkZGRkYiIHAtaWQ9IjM0NjMxIj48L3BhdGg+PHBhdGggZD0iTTUxMiA1MTJjMTkuOTExMTExIDAgMzUuNTU1NTU2IDE1LjY0NDQ0NCAzNS41NTU1NTYgMzQuMTMzMzMzIDAgMTguNDg4ODg5LTE1LjY0NDQ0NCAzNC4xMzMzMzMtMzUuNTU1NTU2IDM0LjEzMzMzMy0xOS45MTExMTEgMC0zNS41NTU1NTYtMTUuNjQ0NDQ0LTM1LjU1NTU1Ni0zNC4xMzMzMzNDNDc2LjQ0NDQ0NCA1MjcuNjQ0NDQ0IDQ5Mi4wODg4ODkgNTEyIDUxMiA1MTJ6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSIzNDYzMiI+PC9wYXRoPjxwYXRoIGQ9Ik01MTIgNTQ2LjEzMzMzM2M5Ljk1NTU1NiAwIDE3LjA2NjY2NyA3LjExMTExMSAxNy4wNjY2NjcgMTcuMDY2NjY3bDAgNjkuNjg4ODg5YzAgOS45NTU1NTYtOC41MzMzMzMgMTcuMDY2NjY3LTE3LjA2NjY2NyAxNy4wNjY2NjctOS45NTU1NTYgMC0xNy4wNjY2NjctNy4xMTExMTEtMTcuMDY2NjY3LTE3LjA2NjY2N2wwLTY5LjY4ODg4OUM0OTQuOTMzMzMzIDU1NC42NjY2NjcgNTAyLjA0NDQ0NCA1NDYuMTMzMzMzIDUxMiA1NDYuMTMzMzMzeiIgZmlsbD0iI0ZGRkZGRiIgcC1pZD0iMzQ2MzMiPjwvcGF0aD48L3N2Zz4=' btnRestrictEdit.OnAction = async function(){ enabledStatus = await RestrictEdit.Enabled RestrictEdit.Enabled = !enabledStatus; if(enabledStatus){ btnRestrictEdit.Caption = '限制编辑(启用)'; }else{ btnRestrictEdit.Caption = '限制编辑(禁用)'; } } //只读模式切换 const btnReadOnly = await popupControls.Add(1); enabledStatus = await app.ActiveDocument.ReadOnly; const base64ReadOnly = 'data:image/svg+xml;base64,PHN2ZyB0PSIxNzQzNjcyMTgzMDAwIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjEyNDU3IiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+PHBhdGggZD0iTTcyNC44NTIzNjQgMzcuMjM2MzY0YzYyLjM3MDkwOSAwIDkzLjEzNzQ1NSA1Ljk1NzgxOCAxMjUuMTYwNzI3IDIzLjA0YTE2NC4xMTkyNzMgMTY0LjExOTI3MyAwIDAgMSA2OC4wNDk0NTQgNjguMDQ5NDU0YzE1Ljk2NTA5MSAyOS44ODIxODIgMjIuMjAyMTgyIDU4LjY0NzI3MyAyMi45NDY5MSAxMTMuMTA1NDU1bDAuMDkzMDkgMTIuMDU1MjcyVjUxMmEzNy4yMzYzNjQgMzcuMjM2MzY0IDAgMCAxLTc0LjE5MzQ1NCA0LjY1NDU0NWwtMC4yNzkyNzMtNC42NTQ1NDVWMjUzLjQ4NjU0NWwtMC4yMzI3MjctMjAuMDE0NTQ1LTAuNzQ0NzI3LTE2Ljc1NjM2NGMtMS42NzU2MzYtMjUuMzY3MjczLTUuNzI1MDkxLTM5LjE0NDcyNy0xMy4yNjU0NTUtNTMuMjQ4YTg5LjY0NjU0NSA4OS42NDY1NDUgMCAwIDAtMzcuNTE1NjM2LTM3LjUxNTYzNmMtMTUuNDk5NjM2LTguMjg1MDkxLTMwLjYyNjkwOS0xMi4zMzQ1NDUtNjEuMjA3MjczLTEzLjY4NDM2NGwtMTguMzM4OTA5LTAuNDY1NDU0LTEwLjQ3MjcyNy0wLjA5MzA5MUgzMDAuMDMybC0yMC4wMTQ1NDUgMC4yMzI3MjdjLTM2LjU4NDcyNyAwLjkzMDkwOS01My4wNjE4MTggNC45ODAzNjQtNzAuMDA0MzY0IDE0LjAxMDE4Mi0xNi4yOTA5MDkgOC43MDQtMjguODExNjM2IDIxLjI3MTI3My0zNy41MTU2MzYgMzcuNTE1NjM2LTguMjg1MDkxIDE1LjQ5OTYzNi0xMi4zMzQ1NDUgMzAuNjI2OTA5LTEzLjY4NDM2NCA2MS4yMDcyNzNsLTAuNDY1NDU1IDE4LjMzODkwOS0wLjA5MzA5MSAxMC40NzI3Mjd2NTE3LjAyNjkxbDAuMjMyNzI4IDIwLjA2MTA5YzAuOTMwOTA5IDM2LjU4NDcyNyA0Ljk4MDM2NCA1My4wNjE4MTggMTQuMDEwMTgyIDY5Ljk1NzgxOSA4LjcwNCAxNi4yOTA5MDkgMjEuMjcxMjczIDI4LjgxMTYzNiAzNy41MTU2MzYgMzcuNTE1NjM2IDE0LjEwMzI3MyA3LjU0MDM2NCAyNy45MjcyNzMgMTEuNTg5ODE4IDUzLjI0OCAxMy4yNjU0NTVsMTYuNzU2MzY0IDAuNzQ0NzI3IDIwLjAxNDU0NSAwLjIzMjcyN0g0MTEuOTI3MjczYTM3LjIzNjM2NCAzNy4yMzYzNjQgMCAwIDEgNC42NTQ1NDUgNzQuMTkzNDU1bC00LjY1NDU0NSAwLjI3OTI3MkgzMDAuMDMyYy02Mi4zNzA5MDkgMC05My4xMzc0NTUtNS45NTc4MTgtMTI1LjE2MDcyNy0yMy4wNGExNjQuMTE5MjczIDE2NC4xMTkyNzMgMCAwIDEtNjguMDQ5NDU1LTY4LjA0OTQ1NGMtMTUuOTY1MDkxLTI5Ljg4MjE4Mi0yMi4yMDIxODItNTguNjQ3MjczLTIyLjk0NjkwOS0xMTMuMTA1NDU1TDgzLjc4MTgxOCA3NzAuNTEzNDU1VjI1My40ODY1NDVjMC02Mi4zNzA5MDkgNS45NTc4MTgtOTMuMTM3NDU1IDIzLjA0LTEyNS4xNjA3MjdhMTY0LjExOTI3MyAxNjQuMTE5MjczIDAgMCAxIDY4LjA0OTQ1NS02OC4wNDk0NTRDMjA0LjggNDQuMzExMjczIDIzMy41MTg1NDUgMzguMDc0MTgyIDI4Ny45NzY3MjcgMzcuMzI5NDU1TDMwMC4wMzIgMzcuMjM2MzY0aDQyNC44MjAzNjR6TTcyMS40NTQ1NDUgNTg2LjQ3MjcyN2M5NC4yNTQ1NDUgMCAxNzkuNTcyMzY0IDYyLjA0NTA5MSAyNTYgMTg2LjE4MTgxOC03Ni40Mjc2MzYgMTI0LjEzNjcyNy0xNjEuNzQ1NDU1IDE4Ni4xODE4MTgtMjU2IDE4Ni4xODE4MTlzLTE3OS41NzIzNjQtNjIuMDQ1MDkxLTI1Ni0xODYuMTgxODE5Yzc2LjQyNzYzNi0xMjQuMTM2NzI3IDE2MS43NDU0NTUtMTg2LjE4MTgxOCAyNTYtMTg2LjE4MTgxOHogbTgyLjMzODkxIDEwMC44MTc0NTVsMi4wOTQ1NDUgNC4xODkwOTFhOTMuMDkwOTA5IDkzLjA5MDkwOSAwIDEgMS0xNzcuMjkxNjM2IDQ2LjE3MzA5MWwtMC4yMzI3MjgtNi44ODg3MjhjMC0xNS42ODU4MTggMy44NjMyNzMtMzAuNDg3MjczIDEwLjcwNTQ1NS00My40MjY5MDktMjYuNDM3ODE4IDE3LjIyMTgxOC01Mi45MjIxODIgNDMuMTk0MTgyLTc5LjQwNjU0NiA3OC43MDgzNjRsLTQuNzk0MTgxIDYuNjA5NDU0IDQuNzk0MTgxIDYuNjA5NDU1YzUxLjI5MzA5MSA2OC43OTQxODIgMTAyLjUzOTYzNiAxMDEuODg4IDE1NC4wNjU0NTUgMTA0Ljg2NjkwOUw3MjEuNDU0NTQ1IDg4NC4zNjM2MzZjNTQuMTMyMzY0IDAgMTA3Ljk4NTQ1NS0zMi44NjEwOTEgMTYxLjc5Mi0xMDUuMDk5NjM2bDQuNzQ3NjM3LTYuNjA5NDU1LTQuNzQ3NjM3LTYuNjA5NDU0Yy0yMy41NTItMzEuNTU3ODE4LTQ3LjA1NzQ1NS01NS42MjE4MTgtNzAuNjU2LTcyLjcwNGwtOC43OTcwOS02LjA1MDkwOXpNNjc0LjkwOTA5MSA2ODQuMjE4MTgyYTQ2LjU0NTQ1NSA0Ni41NDU0NTUgMCAxIDAgMCA5My4wOTA5MDkgNDYuNTQ1NDU1IDQ2LjU0NTQ1NSAwIDAgMCAwLTkzLjA5MDkwOXogbS0yNzAuMzgyNTQ2LTIzLjI3MjcyN2EzNy4yMzYzNjQgMzcuMjM2MzY0IDAgMCAxIDQuNjU0NTQ2IDc0LjE5MzQ1NGwtNC42NTQ1NDYgMC4yNzkyNzNIMzA3LjJhMzcuMjM2MzY0IDM3LjIzNjM2NCAwIDAgMS00LjY1NDU0NS03NC4xOTM0NTVsNC42NTQ1NDUtMC4yNzkyNzJoOTcuMzI2NTQ1eiBtMTMwLjc0NjE4Mi0xODYuMTgxODE5YTM3LjIzNjM2NCAzNy4yMzYzNjQgMCAwIDEgNC42NTQ1NDYgNzQuMTkzNDU1bC00LjY1NDU0NiAwLjI3OTI3M0gzMDcuMmEzNy4yMzYzNjQgMzcuMjM2MzY0IDAgMCAxLTQuNjU0NTQ1LTc0LjE5MzQ1NWw0LjY1NDU0NS0wLjI3OTI3M2gyMjguMDcyNzI3eiBtMTgxLjIwMTQ1NS0xODYuMTgxODE4YTM3LjIzNjM2NCAzNy4yMzYzNjQgMCAwIDEgNC42NTQ1NDUgNzQuMTkzNDU1bC00LjY1NDU0NSAwLjI3OTI3MkgzMDcuMmEzNy4yMzYzNjQgMzcuMjM2MzY0IDAgMCAxLTQuNjU0NTQ1LTc0LjE5MzQ1NGw0LjY1NDU0NS0wLjI3OTI3M2g0MDkuMjc0MTgyeiIgZmlsbD0iIzI2MjYyNiIgcC1pZD0iMTI0NTgiPjwvcGF0aD48L3N2Zz4=' const base64Edit = 'data:image/svg+xml;base64,PHN2ZyB0PSIxNzQzNjcyMzMwNjE4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE0NDQ5IiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+PHBhdGggZD0iTTQ3Ny44MTUgMzE4LjU3SDI4NC4yMzNjLTE3LjQgMC0zMi42MjMgMTQuMTM3LTMyLjYyMyAzMS41MzggMCAxNy40IDE0LjEzNyAzMS41MzggMzIuNjIzIDMxLjUzOGgxOTMuNTgyYzE3LjQgMCAzMi42MjMtMTQuMTM4IDMyLjYyMy0zMS41MzgtMS4wODUtMTcuNDAxLTE1LjIyMy0zMS41MzgtMzIuNjIzLTMxLjUzOHoiIHAtaWQ9IjE0NDUwIj48L3BhdGg+PHBhdGggZD0iTTg2My44ODYgMjU0LjQwM2MtMTcuNCAwLTMyLjYyNCAxNC4xMzgtMzIuNjI0IDMxLjUzOHY1NzUuMTM3YzAgMTcuNDAxLTE0LjEzNyAzMS41MzgtMzIuNjI4IDMxLjUzOEgyMjQuMDcyYy0xNy40MDEgMC0zMi42MjktMTQuMTM3LTMyLjYyOS0zMS41MzhWMTU4LjcwM2MwLTE3LjQwMSAxNC4xNDItMzEuNTM4IDMyLjYyOS0zMS41MzhoNDQ3LjMyNGMxNy40IDAgMzIuNjIzLTE0LjE0MyAzMi42MjMtMzEuNTQyIDAtMTcuNDAxLTE0LjEzNy0zMS41MzgtMzIuNjIzLTMxLjUzOEgyMjQuMDcyYy01My4yODggMC05Ni43OTEgNDMuNTAzLTk2Ljc5MSA5NS43MDV2NzAyLjM3NWMwIDUzLjI5MiA0My41MDMgOTUuNzA1IDk2Ljc5MSA5NS43MDVoNTc1LjY1MmM1My4yODggMCA5Ni43ODctNDMuNDk4IDk2Ljc4Ny05NS43MDVWMjg3LjAzMmMtMC4wMDEtMTguNDkxLTE0LjEzOS0zMi42MjktMzIuNjI1LTMyLjYyOXoiIHAtaWQ9IjE0NDUxIj48L3BhdGg+PHBhdGggZD0iTTYwNi4wMTkgNTA5Ljk3NUgyODQuMjMzYy0xNy40IDAtMzEuNTM4IDE0LjEzNy0zMS41MzggMzEuNTM4IDAgMTcuNCAxNC4xMzggMzEuNTM4IDMyLjYyOSAzMS41MzhINjA2LjAyYzE3LjQgMCAzMi42MjMtMTQuMTM4IDMyLjYyMy0zMS41MzggMC0xNy40MDEtMTQuMTM3LTMxLjUzOC0zMi42MjQtMzEuNTM4ek0yNTIuNjk1IDczNS43NjFjMCAxNy40IDE0LjEzOCAzMS41MzggMzIuNjI5IDMxLjUzOGg0NTIuNzQyYzE3LjQgMCAzMi42MjMtMTQuMTM4IDMyLjYyMy0zMS41MzggMC0xNy40MDEtMTQuMTM3LTMxLjUzOC0zMi42MjMtMzEuNTM4SDI4NC4yMzNjLTE3LjQgMC0zMS41MzggMTQuMTM3LTMxLjUzOCAzMS41Mzh6TTk1My4wNjUgMTAuNzk4Yy0xMy4wNTEtMTEuOTYyLTMyLjYyOS0xMS45NjItNDUuNjc5IDBMNTg3LjY1NyAzMjguMzU0Yy0xMy4wNTIgMTEuOTY1LTEzLjA1MiAzMi42MjggMCA0NS42NzkgNi41MjEgNi41MjEgMTQuMTM4IDkuNzg0IDIyLjgzNiA5Ljc4NCA4LjcwMiAwIDE2LjMxNS0zLjI2MyAyMi44NC05Ljc4NEw5NTMuMDY1IDU1LjM4NmMxMy4wNDctMTEuOTY1IDEzLjA0Ny0zMi42MjMgMC00NC41ODh6IiBwLWlkPSIxNDQ1MiI+PC9wYXRoPjwvc3ZnPg==' btnReadOnly.Caption = enabledStatus ? '编辑模式' : '只读模式'; btnReadOnly.Picture = enabledStatus ? base64Edit : base64ReadOnly btnReadOnly.OnAction = async function(){ enabledStatus = await app.ActiveDocument.ReadOnly; await app.ActiveDocument.SetReadOnly({ Value: !enabledStatus, }); if(enabledStatus){ btnReadOnly.Caption = '只读模式'; btnReadOnly.Picture = base64ReadOnly }else{ btnReadOnly.Caption = '编辑模式'; btnReadOnly.Picture = base64Edit } } //启动保护 const ToggleProtect = await popupControls.Add(1); enabledStatus = await app.ActiveDocument.RestrictEditMode const base64Protect = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzQ0OTY2MzAwMTQ5IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjEzODU3IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiPjxwYXRoIGQ9Ik01MTAuNTc3Nzc4IDBjLTEyLjggMC0yNS42IDQuMjY2NjY3LTM2Ljk3Nzc3OCAxMS4zNzc3NzhDNDcwLjc1NTU1NiAxMi44IDM5Mi41MzMzMzMgOTUuMjg4ODg5IDMxNS43MzMzMzMgMTEzLjc3Nzc3OGMtNDkuNzc3Nzc4IDEyLjgtMTA1LjI0NDQ0NCAxNC4yMjIyMjItMTMyLjI2NjY2NyAxNC4yMjIyMjItMTcuMDY2NjY3IDAtMjcuMDIyMjIyIDAtMjguNDQ0NDQ0IDAtMS40MjIyMjIgMC0yLjg0NDQ0NCAwLTQuMjY2NjY3IDAtMTcuMDY2NjY3IDAtMzIuNzExMTExIDUuNjg4ODg5LTQ1LjUxMTExMSAxNy4wNjY2NjdDOTIuNDQ0NDQ0IDE1Ni40NDQ0NDQgODUuMzMzMzMzIDE3My41MTExMTEgODUuMzMzMzMzIDE5MC41Nzc3NzhsMCAxNjAuNzExMTExYzAgNTkzLjA2NjY2NyAzOTYuOCA2NjguNDQ0NDQ0IDQxMy44NjY2NjcgNjcxLjI4ODg4OSA0LjI2NjY2NyAwIDcuMTExMTExIDEuNDIyMjIyIDExLjM3Nzc3OCAxLjQyMjIyMiA0LjI2NjY2NyAwIDcuMTExMTExIDAgMTEuMzc3Nzc4LTEuNDIyMjIyQzUzOS4wMjIyMjIgMTAxOS43MzMzMzMgOTM4LjY2NjY2NyA5NDQuMzU1NTU2IDkzOC42NjY2NjcgMzUxLjI4ODg4OUw5MzguNjY2NjY3IDE5MC41Nzc3NzhjMC0xNy4wNjY2NjctNy4xMTExMTEtMzQuMTMzMzMzLTIxLjMzMzMzMy00Ni45MzMzMzMtMTIuOC0xMS4zNzc3NzgtMjguNDQ0NDQ0LTE3LjA2NjY2Ny00NC4wODg4ODktMTcuMDY2NjY3LTEuNDIyMjIyIDAtMi44NDQ0NDQgMC00LjI2NjY2NyAwLTEuNDIyMjIyIDAtMTEuMzc3Nzc4IDAtMjguNDQ0NDQ0IDAtMjcuMDIyMjIyIDAtODEuMDY2NjY3LTEuNDIyMjIyLTEzMC44NDQ0NDQtMTQuMjIyMjIyQzY0NC4yNjY2NjcgOTguMTMzMzMzIDU2OC44ODg4ODkgMjUuNiA1NDcuNTU1NTU2IDExLjM3Nzc3OCA1MzYuMTc3Nzc4IDQuMjY2NjY3IDUyMy4zNzc3NzggMCA1MTAuNTc3Nzc4IDBMNTEwLjU3Nzc3OCAweiIgZmlsbD0iI0ZGQ0MyMiIgcC1pZD0iMTM4NTgiPjwvcGF0aD48cGF0aCBkPSJNNjQyLjg0NDQ0NCAzNTUuNTU1NTU2Yy05Ljk1NTU1NiAyLjg0NDQ0NC0xOC40ODg4ODktMi44NDQ0NDQtMjEuMzMzMzMzLTEyLjhsLTcuMTExMTExLTI5Ljg2NjY2N0M1OTcuMzMzMzMzIDI1NiA1NDQuNzExMTExIDIyMS44NjY2NjcgNDgzLjU1NTU1NiAyMzcuNTExMTExYy02MS4xNTU1NTYgMTUuNjQ0NDQ0LTg4LjE3Nzc3OCA3Mi41MzMzMzMtNzIuNTMzMzMzIDEyOS40MjIyMjJsMTEuMzc3Nzc4IDUyLjYyMjIyMmMyLjg0NDQ0NCA4LjUzMzMzMy0yLjg0NDQ0NCAxOC40ODg4ODktMTIuOCAyMS4zMzMzMzMtOS45NTU1NTYgMi44NDQ0NDQtMTguNDg4ODg5LTIuODQ0NDQ0LTIxLjMzMzMzMy0xMi44bC0xMS4zNzc3NzgtNTIuNjIyMjIyYy0xOS45MTExMTEtNzUuMzc3Nzc4IDE3LjA2NjY2Ny0xNTAuNzU1NTU2IDk4LjEzMzMzMy0xNzIuMDg4ODg5IDc5LjY0NDQ0NC0yMS4zMzMzMzMgMTUyLjE3Nzc3OCAyNC4xNzc3NzggMTczLjUxMTExMSAxMDAuOTc3Nzc4bDcuMTExMTExIDI5Ljg2NjY2N0M2NTcuMDY2NjY3IDM0Mi43NTU1NTYgNjUxLjM3Nzc3OCAzNTIuNzExMTExIDY0Mi44NDQ0NDQgMzU1LjU1NTU1NnoiIGZpbGw9IiNGRkZGRkYiIHAtaWQ9IjEzODU5Ij48L3BhdGg+PHBhdGggZD0iTTY2OS44NjY2NjcgNzUzLjc3Nzc3OCAzNTQuMTMzMzMzIDc1My43Nzc3NzhjLTM4LjQgMC02OS42ODg4ODktMzEuMjg4ODg5LTY5LjY4ODg4OS02OS42ODg4ODlMMjg0LjQ0NDQ0NCA0NzYuNDQ0NDQ0YzAtMzguNCAzMS4yODg4ODktNjkuNjg4ODg5IDY5LjY4ODg4OS02OS42ODg4ODlsMzE1LjczMzMzMyAwYzM4LjQgMCA2OS42ODg4ODkgMzEuMjg4ODg5IDY5LjY4ODg4OSA2OS42ODg4ODlsMCAyMDcuNjQ0NDQ0QzczOS41NTU1NTYgNzIyLjQ4ODg4OSA3MDguMjY2NjY3IDc1My43Nzc3NzggNjY5Ljg2NjY2NyA3NTMuNzc3Nzc4ek0zNTQuMTMzMzMzIDQ0Mi4zMTExMTFjLTE5LjkxMTExMSAwLTM1LjU1NTU1NiAxNS42NDQ0NDQtMzUuNTU1NTU2IDM0LjEzMzMzM2wwIDIwNy42NDQ0NDRjMCAxOC40ODg4ODkgMTUuNjQ0NDQ0IDM0LjEzMzMzMyAzNS41NTU1NTYgMzQuMTMzMzMzbDMxNS43MzMzMzMgMGMxOS45MTExMTEgMCAzNS41NTU1NTYtMTUuNjQ0NDQ0IDM1LjU1NTU1Ni0zNC4xMzMzMzNMNzA1LjQyMjIyMiA0NzYuNDQ0NDQ0YzAtMTguNDg4ODg5LTE1LjY0NDQ0NC0zNC4xMzMzMzMtMzUuNTU1NTU2LTM0LjEzMzMzM0wzNTQuMTMzMzMzIDQ0Mi4zMTExMTF6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSIxMzg2MCI+PC9wYXRoPjxwYXRoIGQ9Ik01MTIgNTEyYzE5LjkxMTExMSAwIDM1LjU1NTU1NiAxNS42NDQ0NDQgMzUuNTU1NTU2IDM0LjEzMzMzMyAwIDE4LjQ4ODg4OS0xNS42NDQ0NDQgMzQuMTMzMzMzLTM1LjU1NTU1NiAzNC4xMzMzMzMtMTkuOTExMTExIDAtMzUuNTU1NTU2LTE1LjY0NDQ0NC0zNS41NTU1NTYtMzQuMTMzMzMzQzQ3Ni40NDQ0NDQgNTI3LjY0NDQ0NCA0OTIuMDg4ODg5IDUxMiA1MTIgNTEyeiIgZmlsbD0iI0ZGRkZGRiIgcC1pZD0iMTM4NjEiPjwvcGF0aD48cGF0aCBkPSJNNTEyIDU0Ni4xMzMzMzNjOS45NTU1NTYgMCAxNy4wNjY2NjcgNy4xMTExMTEgMTcuMDY2NjY3IDE3LjA2NjY2N2wwIDY5LjY4ODg4OWMwIDkuOTU1NTU2LTguNTMzMzMzIDE3LjA2NjY2Ny0xNy4wNjY2NjcgMTcuMDY2NjY3LTkuOTU1NTU2IDAtMTcuMDY2NjY3LTcuMTExMTExLTE3LjA2NjY2Ny0xNy4wNjY2NjdsMC02OS42ODg4ODlDNDk0LjkzMzMzMyA1NTQuNjY2NjY3IDUwMi4wNDQ0NDQgNTQ2LjEzMzMzMyA1MTIgNTQ2LjEzMzMzM3oiIGZpbGw9IiNGRkZGRkYiIHAtaWQ9IjEzODYyIj48L3BhdGg+PC9zdmc+' const base64UnProtect = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzQ0OTY2NTA2MTg4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI4MTQ3IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiPjxwYXRoIGQ9Ik03NjguMjU0MjIgMHE0OC44MTAzMjggMCA5NC4wNjE1NjkgMTguMzAzODczdDgwLjMzMzY2NCA1MC4zMzU2NSA1Ni40MzY5NDEgNzQuNzQwODE0IDIxLjM1NDUxOCA5MS41MTkzNjRsMCAxNTAuNDk4NTEtMTIzLjA0MjcwMSAwIDAtMTIyLjAyNTgxOXEwLTY0LjA2MzU1NS0zNi4wOTkzMDUtOTkuNjU0NDE5dC05Ny4xMTIyMTQtMzUuNTkwODY0cS01NC45MTE2MTkgMC04OC40Njg3MTkgMzUuNTkwODY0dC0zMy41NTcxIDk5LjY1NDQxOWwwIDEyNC4wNTk1ODMtMTI4LjEyNzExIDAgMC0xNTIuNTMyMjc0cTAtNDguODEwMzI4IDE5LjMyMDc1NS05MS41MTkzNjR0NTMuMzg2Mjk2LTc0Ljc0MDgxNCA4MC4zMzM2NjQtNTAuMzM1NjUgMTAxLjE3OTc0Mi0xOC4zMDM4NzN6TTc2Ni4yMjA0NTcgNjkzLjUxMzQwNmwwIDg3LjQ1MTgzNyAwIDQ3Ljc5MzQ0NnEwIDI3LjQ1NTgwOS05LjY2MDM3NyA1MS44NjA5NzN0LTI2LjQzODkyOCA0MS42OTIxNTUtMzkuNjU4MzkxIDI3LjQ1NTgwOS01MC4zMzU2NSAxMC4xNjg4MThsLTUxNC41NDIyMDUgMHEtMjcuNDU1ODA5IDAtNDkuODI3MjEtOS42NjAzNzd0LTM4LjY0MTUwOS0yNi40Mzg5MjgtMjQuOTEzNjA1LTM5LjE0OTk1LTguNjQzNDk2LTQ3Ljc5MzQ0NmwwLTMyMy4zNjg0MjFxMC0yOC40NzI2OTEgMTkuODI5MTk2LTQ3Ljc5MzQ0NnQ0Ni4yNjgxMjMtMTkuMzIwNzU1bDYyOS40NDk4NTEgMHEyOC40NzI2OTEgMCA0Ny43OTM0NDYgMTkuMzIwNzU1dDE5LjMyMDc1NSA0Ny43OTM0NDZsMCAxNzkuOTg4MDgzeiIgcC1pZD0iMjgxNDgiIGZpbGw9IiMxYWZhMjkiPjwvcGF0aD48L3N2Zz4=' ToggleProtect.Caption = enabledStatus > 0 ? '停止保护' : '启动保护'; ToggleProtect.Picture = enabledStatus ? base64UnProtect : base64Protect ToggleProtect.OnAction = async function(){ enabledStatus = await app.ActiveDocument.RestrictEditMode if(enabledStatus > 0){ await app.ActiveDocument.Unprotect('eGidu4AltoWHPV2NcHd') ToggleProtect.Caption = '启动保护'; ToggleProtect.Picture = base64Protect }else{ await app.ActiveDocument.Protect('eGidu4AltoWHPV2NcHd') ToggleProtect.Caption = '停止保护'; ToggleProtect.Picture = base64UnProtect await app.ActiveDocument.SetContentControlAuthority('read', [ { tag: 'test', access: 'edit' } ]) } } //设置焦点 controlButton.SetFocus(true); } async function SwitchRestrictEditEnabled(isEnabled) { await GlobalWps.ready(); const app = GlobalWps.Application; const RestrictEdit = await app.CommandBars('MoreMenus'); const {taskStatus} = this.state console.log(taskStatus) if(RestrictEdit){ console.log(RestrictEdit) RestrictEdit.Enabled = isEnabled; } } /* end:WPS */ /* begin:SpreadJS */ btnplugin.addEventListener("click", (e) => { clearTimeout(timeoutId); timeoutId = setTimeout(() => { let sp = getSp() if(!isDesigner){ addCustomMenu(sp) hasCustomMenu = true let parentDiv = document.querySelector(".ant-message") let span let div let msgTimer if(parentDiv){ span = parentDiv.querySelector("span") if(span){ div = span.querySelector("div") if(div){ span.removeChild(div) } div = document.createElement("div") div.innerHTML = msg span.appendChild(div) div.addEventListener("mouseover", function() { clearTimeout(msgTimer) }) div.addEventListener("mouseout", function() { msgTimer = setTimeout(function() { span.removeChild(div); }, 2000) }) } } msgTimer = setTimeout(function() { span.removeChild(div) }, 2000) } }, 300) },false) //setToolBtn(0) function setToolBtn(reTryCounts){ if(reTryCounts <= 50){ setTimeout(() => { let toolbar = document.getElementsByClassName("content-box")[0]; if(toolbar){ let doc = document.head || document.documentElement doc.appendChild(myStyle) toolbar.prepend(btnplugin) reTryCounts = 0 } else{ reTryCounts += 1 setToolBtn(reTryCounts) } }, 2000) } } function spreadGlobalConfig(){ const sp = getSp() let sh = sp.getActiveSheet() sh.options.isProtected = false } function bindNewRowUnlockCell(){ const sp = getSp() sp.bind(GC.Spread.Sheets.Events.RowHeightChanged,function(event,data){ let sh = sp.getActiveSheet() console.log(event) sh.options.isProtected = false }) sp.bind(GC.Spread.Sheets.Events.SelectionChanged,function(event,data){ let sh = sp.getActiveSheet() event.options.isProtected = false }) } function unlockToolBar(){ const inputBar = document.getElementsByClassName("spread-tool")[0].querySelector("input") inputBar.className ="ant-input" inputBar.removeAttribute("disabled") } function lockToolBar(){ const inputBar = document.getElementsByClassName("spread-tool")[0].querySelector("input") inputBar.classList.add ="ant-input-disabled" inputBar.setAttribute("disabled", "disabled") } function setValue(para){ const sp = getSp() stopUpdate(sp) let sh = sp.getActiveSheet() let selCells = sh.getSelections() setToolBarValue(sh,!para) selCells.forEach((e) => { sh.getRange(e.row,e.col,e.rowCount,e.colCount).value(para) }) startUpdate(sp) } function setFormula(para){ const sp = getSp() stopUpdate(sp) let sh = sp.getActiveSheet() let selCells = sh.getSelections() setToolBarValue(sh,!para) selCells.forEach((e) => { sh.setArrayFormula(e.row,e.col,e.rowCount,e.colCount,para,null) }) startUpdate(sp) } function cleanDataValidator(){ const sp = getSp() let sh = sp.getActiveSheet() let selCells = sh.getSelections() selCells.forEach((e) => { sh.setDataValidator(e.row,e.col,e.rowCount,e.colCount,null) }) } function getDataValidator(){ const sp = getSp() let sh = sp.getActiveSheet() let selCells = sh.getSelections() let data = [] const dvTempHtml = ` <div class="tm-modal-content"> <div class="tm-modal-header"> <h2 class="tm-modal-title">数据校验清单</h2> <span class="tm-modal-close">×</span> </div> <div class="tm-table-container"> <table class="tm-table"> <thead> <tr id="tableHeader"></tr> </thead> <tbody id="tableBody"></tbody> </table> </div> <div class="tm-modal-footer"> <button class="tm-btn" id="okBtn">关闭</button> </div> </div> ` let container = document.getElementById('dvListModal') if(container){container.innerHTML=''}else{ container = document.createElement("div"); container.id = 'dvListModal' container.classList.add("tm-modal") } container.innerHTML = dvTempHtml document.body.appendChild(container) const closeBtn = document.querySelector('.tm-modal-close'); const okBtn = document.getElementById('okBtn'); const tableHeader = document.getElementById('tableHeader'); const tableBody = document.getElementById('tableBody'); selCells.forEach((e) => { for(let i = e.row; i < e.row + e.rowCount;i++){ for(let j = e.col; j < e.col + e.colCount;j++){ let dvObj = {} dvObj.dv = sh.getDataValidator(i,j) if(dvObj.dv){ dvObj.rng = getRangeAddress(sh.getCell(i,j)) dvObj.inputTitle = dvObj.dv.inputTitle() dvObj.inputMessage = dvObj.dv.inputMessage() dvObj.errorTitle = dvObj.dv.errorTitle() dvObj.errorMessage = dvObj.dv.errorMessage() dvObj.errorStyle = enumErrorStyle[dvObj.dv.errorStyle()] dvObj.dvtype = enumTypes[dvObj.dv.type()] dvObj.comparisonOperator = enumOperators[dvObj.dv.comparisonOperator()] dvObj.highlightStyle = enumHighlightType[dvObj.dv.highlightStyle().type] dvObj.ignoreBlank = enumTrueFalse[dvObj.dv.ignoreBlank()] dvObj.inCellDropdown = enumTrueFalse[dvObj.dv.inCellDropdown()] if(dvObj.dv.type()!==7){ dvObj.formulaStr = "" }else{ dvObj.formulaStr = dvObj.dv.condition().getFormulaString()? dvObj.dv.condition().getFormulaString() : "" } try { dvObj.validList = dvObj.dv.getValidList() ? dvObj.dv.getValidList(): "" } catch (error) { dvObj.validList = dvObj.dv.condition().getFormulaString() ? dvObj.dv.condition().getFormulaString() : "" dvObj.formulaStr = "" } dvObj.value1 = dvObj.formulaStr || dvObj.validList ? "" :dvObj.dv.value1() dvObj.value2 = dvObj.formulaStr || dvObj.validList ? "" :dvObj.dv.value2() data.push(dvObj) } } } }) if(data.length){ const headers = ['序号', '单元格', '提示标题','提示消息', '类型', '操作符', '忽略空值', '提供下拉按钮', '错误类型', '错误标题', '错误消息', '高亮样式', '最小值', '最大值', '公式', '序列']; headers.forEach(header => { const th = document.createElement('th'); th.textContent = header; if (header === '公式') { const resizeHandle = document.createElement('div'); resizeHandle.className = 'tm-resize-handle'; resizeHandle.addEventListener('mousedown', (e) => { const startX = e.clientX; const startWidth = th.offsetWidth; const onMouseMove = (moveEvent) => { const dx = moveEvent.clientX - startX; th.style.width = `${startWidth + dx}px`; const formulaCells = document.querySelectorAll('.tm-formula-cell'); formulaCells.forEach((cell) => { cell.style.maxWidth = `${startWidth + dx}px`; }); }; const onMouseUp = () => { document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); }; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); }); th.appendChild(resizeHandle); } tableHeader.appendChild(th); }); let orderNum = 1 data.forEach(item => { const row = document.createElement('tr'); const values = [orderNum++,item.rng, item.inputTitle,item.inputMessage, item.dvtype, item.comparisonOperator, item.ignoreBlank,item.inCellDropdown,item.errorStyle,item.errorTitle,item.errorMessage, item.highlightStyle,item.value1,item.value2,item.formulaStr,item.validList]; values.forEach((value,index) => { const td = document.createElement('td'); td.textContent = value || ''; if(index === 14){ td.title = value; const copyIcon = document.createElement('span'); copyIcon.className = 'tm-copy-icon'; copyIcon.textContent = '📋'; copyIcon.addEventListener('click',async function(){ const value = td.textContent.replace('📋', '').trim(); try { await navigator.clipboard.writeText(value); } catch (err) { console.log(err) const textarea = document.createElement('textarea'); textarea.value = value; document.body.appendChild(textarea); textarea.select(); document.execCommand('copy'); document.body.removeChild(textarea); } }) td.appendChild(copyIcon) td.classList.add('tm-formula-cell'); } row.appendChild(td); }); tableBody.appendChild(row); }); tableBody.addEventListener('click', function (event) { if (event.target.tagName === 'TD') { const rows = tableBody.querySelectorAll('tr'); rows.forEach(row => { row.classList.remove('selected'); }); const clickedRow = event.target.parentNode; clickedRow.classList.add('selected'); } }); } const closeModal = () => { container.style.display = 'none'; }; let isDragging = false; let offsetX, offsetY; const modalHeader = document.querySelector('.tm-modal-header') const modalFooter = document.querySelector('.tm-modal-footer') modalHeader.addEventListener('mousedown', function (e) { isDragging = true; offsetX = e.clientX - container.offsetLeft; offsetY = e.clientY - container.offsetTop; }); modalFooter.addEventListener('mousedown', function (e) { isDragging = true; offsetX = e.clientX - container.offsetLeft; offsetY = e.clientY - container.offsetTop; }); document.addEventListener('mousemove', function (e) { if (isDragging) { container.style.left = (e.clientX - offsetX) + 'px'; container.style.top = (e.clientY - offsetY) + 'px'; } }); document.addEventListener('mouseup', function () { isDragging = false; }); closeBtn.addEventListener('click', closeModal); okBtn.addEventListener('click', closeModal); container.style.display = 'block'; } function getRangeAddress(rng){ let addressValue = GC.Spread.Sheets.CalcEngine.rangeToFormula(rng, 0, 0, GC.Spread.Sheets.CalcEngine.RangeReferenceRelative.allRelative) return addressValue } function lockCell(para){ const sp = getSp() stopUpdate(sp) let sh = sp.getActiveSheet() let selCells = sh.getSelections() let bgColor = unlockColor if(para){ bgColor = lockColor } selCells.forEach((e) => { sh.getRange(e.row,e.col,e.rowCount,e.colCount).locked(para) sh.getRange(e.row,e.col,e.rowCount,e.colCount).backColor(bgColor) }) startUpdate(sp) } function isShowFormula(){ const sp = getSp() let sh = sp.getActiveSheet() sh.options.showFormulas = !sh.options.showFormulas if(sh.options.showFormulas){ btn10.innerText = "隐藏公式" } else{ btn10.innerText = "显示公式" } } function setRowColVisible(para){ const sp = getSp() stopUpdate(sp) let sh = sp.getActiveSheet() let selCells = sh.getSelections() selCells.forEach((e) => { if((e.row + e.col) == -2){ sh.getRange(e.row,0,1,sh.getColumnCount()).visible(para) sh.getRange(0,e.col,sh.getRowCount(),1).visible(para) } else { sh.getRange(e.row,e.col,e.rowCount,e.colCount).visible(para) } }) startUpdate(sp) } function insertRow(para){ const sp = getSp() stopUpdate(sp) let sh = sp.getActiveSheet() let selCells = sh.getSelections() let count = parseInt(para) selCells.forEach((e) => { sh.addRows(e.row + 1,count) }) startUpdate(sp) } function insertCol(para){ const sp = getSp() stopUpdate(sp) let sh = sp.getActiveSheet() let selCells = sh.getSelections() let count = parseInt(para) selCells.forEach((e) => { sh.addColumns(e.col + 1,count) }) startUpdate(sp) } function showValueAndFormula(){ const sp = getSp() const inputBar = document.getElementsByClassName("spread-tool")[0].querySelector("input") let inputBarVal = document.getElementsByClassName("spread-tool")[0].querySelector("#inputBarVal") inputBar.parentNode.style.display = 'flex' let sh = sp.getActiveSheet() inputBar.style.width = '50%' if(!inputBarVal){ inputBarVal = inputBar.cloneNode() inputBarVal.id = 'inputBarVal' inputBarVal.style.width = '50%' inputBarVal.classList.add('ant-input-disabled') inputBarVal.disabled = 'disabled' inputBar.parentNode.appendChild(inputBarVal) } setToolBarValue(sh,false) sh.bind(GC.Spread.Sheets.Events.SelectionChanged,function (sender,rng) { setToolBarValue(sh,false) sh.options.isProtected = false }) } function turnOnFormulaRef(){ const sp = getSp() let sh = sp.getActiveSheet() sh.bind(GC.Spread.Sheets.Events.SelectionChanged,function (sender,rng) { showPrecedents(sp,sh,rng) sh.options.isProtected = false }) } function showPrecedents(sp,sh,rng){ let newChildNodes = [] let oldChildNodes = [] let currChildNodes = [] let colorInfo = {} try { newChildNodes = sh.getPrecedents(rng.newSelections[0].row, rng.newSelections[0].col) } catch (error) { } try { oldChildNodes = sh.getPrecedents(rng.oldSelections[0].row, rng.oldSelections[0].col) } catch (error) { } if(oldColor.length > 0){ for(let i = 0;i<oldColor.length;i++){ let tarSh = sp.getSheetFromName(oldColor[i].sh) try{ tarSh.getRange(oldColor[i].row,oldColor[i].col,oldColor[i].rowCount,oldColor[i].colCount).backColor(oldColor[i].color) } catch(error){ } } oldColor = [] } if (newChildNodes.length > 0) { newChildNodes.forEach((e)=>{ oldColor.push({row:e.row,col:e.col,rowCount:e.rowCount,colCount:e.colCount,color:sh.getCell(e.row,e.col).backColor(),sh:e.sheetName}) let tarSh = sp.getSheetFromName(e.sheetName) tarSh.getRange(e.row,e.col,e.rowCount,e.colCount).backColor('red') }) } } function setToolBarValue(sh,isClean){ if (isDesigner){return} const inputBar = document.getElementsByClassName("spread-tool")[0].querySelector("input") const inputBarVal = document.getElementsByClassName("spread-tool")[0].querySelector("#inputBarVal") let row = sh.getActiveRowIndex() let col = sh.getActiveColumnIndex() if(sh.hasFormula(row,col)){ isClean ? inputBar.value = "" : inputBar.value = sh.getFormula(row,col) if(inputBarVal){ inputBar.style.width = '50%' inputBarVal.value = sh.getValue(row,col) inputBarVal.style.width = '50%' } }else{ isClean ? inputBar.value = "" : inputBar.value = sh.getValue(row,col) if(inputBarVal){ inputBar.style.width = '50%' inputBarVal.style.width = '50%' inputBarVal.value = inputBar.value } } } function isShowTableHeader(){ const sp = getSp() let sh = sp.getActiveSheet() let tables = sh.tables.all() // btn15.innerText = "显示表头" for(let i = 0; i < tables.length; i++){ let startRow = sh.tables.all()[i].startRow() if(tables[i].hasHeadersRow()){ tables[i].showHeader(false) // btn15.innerText = "显示表头" sh.deleteRows(startRow,1) }else{ sh.addRows(startRow,1) tables[i].showHeader(true) // btn15.innerText = "隐藏表头" } } } function showIndiDim(){ const sp = getSp() let reportInfoVue = document.querySelector('.form-box').__vue__ let reportForm = reportInfoVue._data.reportForm if(!reportForm){return} let uri = "/sctj/api/companyReportVersion/selectAllSheet" let xhr = new XMLHttpRequest() xhr.withCredentials = true let data = JSON.stringify({ "reportCodeEq":reportForm.reportCode, "orgCodeEq": reportForm.orgCode, "versionEq":reportForm.version }) let token = getCookie("Spss-Prod-Access-Token") || getCookie("Spss-Test-Access-Token") || getCookie("Spss-Train-Access-Token") let refreshToken = getCookie("Spss-Prod-Refresh-Token") || getCookie("Spss-Test-Refresh-Token") || getCookie("Spss-Train-Refresh-Token") let resultData={} let dataList = [] if(sp){ let sh = sp.getActiveSheet() let selCells = sh.getSelections() let mgcIndex = sh.tables.all()[0].getColumnIndexInTable("materialGroupCode") let rowMaterialGroupCode = sh.getValue(selCells[0].row,mgcIndex) let colField = sh.tables.all()[0].getColumnDataField(selCells[0].col) selCells.forEach((e) => { }) xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { resultData = JSON.parse(this.responseText).data for(let i = 0; i <resultData.length;i++){ if(resultData[i].hasOwnProperty("dto") && resultData[i].dto.hasOwnProperty("dataList")){ dataList = resultData[i].dto.dataList let r1 = dataList.filter(e=>{return e.materialGroupCode === rowMaterialGroupCode}) if(r1.length>0){ let resultStr = "" if(r1[0][colField].hasOwnProperty('indicatorCode')){ resultStr += "指标:" + r1[0][colField].indicatorCode + "\n" } if(r1[0][colField].hasOwnProperty('dimensionPeriodCode')){ resultStr += "期间:" + r1[0][colField].dimensionPeriodCode + "\n" } if(r1[0][colField].hasOwnProperty('dimensionConstituteCode')){ resultStr += "产品分类:" + r1[0][colField].dimensionConstituteCode + "\n" } if(r1[0][colField].hasOwnProperty('dimensionBlockCode')){ resultStr += "区块:" + r1[0][colField].dimensionBlockCode + "\n" } if(r1[0][colField].hasOwnProperty('dimensionAreaCode')){ resultStr += "地区:" + r1[0][colField].dimensionAreaCode + "\n" } if(r1[0][colField].hasOwnProperty('dimensionAssessCode')){ resultStr += "评估类型:" + r1[0][colField].dimensionAssessCode + "\n" } if(r1[0][colField].hasOwnProperty('dimensionDistributionCode')){ resultStr += "分销渠道:" + r1[0][colField].dimensionDistributionCode + "\n" } if(r1[0][colField].hasOwnProperty('dimensionPlateCode')){ resultStr += "板块:" + r1[0][colField].dimensionPlateCode + "\n" } if(r1[0][colField].hasOwnProperty('dimensionCooperateCode')){ resultStr += "合作方式:" + r1[0][colField].dimensionCooperateCode + "\n" } if(r1[0][colField].hasOwnProperty('selfFormula')){ resultStr += "自定义公式:" + "\n" + r1[0][colField].selfFormula.type + "\n" + r1[0][colField].selfFormula.dataKey } if(resultStr !=""){ let comment = new GC.Spread.Sheets.Comments.Comment() comment.text(resultStr) comment.backColor("yellow") comment.foreColor("green") comment.displayMode(GC.Spread.Sheets.Comments.DisplayMode.alwaysShown) comment.dynamicMove(true) comment.dynamicSize(true) comment.lockText(false) comment.locked(false) sh.getCell(selCells[0].row,selCells[0].col).comment(comment) } } } } } }) xhr.open("POST", uri) xhr.setRequestHeader("Content-Type", "application/json") xhr.setRequestHeader("Authorization", "Bearer " + token) xhr.send(data) } } function getCookie(name) { let arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)"); if(arr=document.cookie.match(reg)) return unescape(arr[2]); else return null; } function getRefreshToken(refreshToken){ let fData = new FormData() fData.append("refreshToken",refreshToken) let xhr = new XMLHttpRequest() xhr.withCredentials = true xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }) xhr.open("POST", "/sctj/api/auth/refreshToken") xhr.send(fData) } function getSp() { let spread try { if ((spread = GC.Spread.Sheets.findControl(container)) !== null) { if (spread !== undefined) { isDesigner = false return spread; } } } catch (error) { } try { if ((spread = GC.Spread.Sheets.findControl(document.getElementsByClassName(containerCls)[0])) !== null) { if (spread !== undefined) { isDesigner = false return spread; } } } catch (error) { } try { if ((spread = GC.Spread.Sheets.Designer.findControl(containerDesign)) !== null) { if (spread.Spread !== undefined) { isDesigner = true return spread.Spread; } } } catch (error) { } try { if ((spread = GC.Spread.Sheets.Designer.findControl(document.getElementsByClassName(containerDesignCls)[0])) !== null) { if (spread.Spread !== undefined) { isDesigner = true return spread.Spread; } } } catch (error) { } } function addCustomMenu(vueSp){ const sp = vueSp let commandManager let customMenu = [ { text: '锁定/解锁', name: 'zLockOnOff', workArea: 'viewport', command: "zLockOnOff", iconClass:"gc-spread-locked", subMenu:[ { text: '锁定单元格(Ctrl+L)', name: 'zLockCell', workArea: 'viewport', command: "zLockCell", iconClass: "ribbon-control-dropdown-lockcells" }, { text: '解锁单元格(Ctrl+K)', name: 'zUnLockCell', workArea: 'viewport', command: "zUnLockCell", iconClass: "gc-spread-editComment" } ] }, { text: '清除', name: 'zCleanContentFormulaVal', workArea: 'viewport', command: "zCleanContentFormulaVal", subMenu:[ { text: '清除值(Ctrl+Shift+G)', name: 'zCleanValue', workArea: 'viewport', command: "zCleanValue", iconClass:"ribbon-button-clear-table-style-element" }, { text: '清除公式 (Ctrl+Shift+H)', name: 'zCleanFormula', workArea: 'viewport', command: "zCleanFormula", iconClass: "gc-spread-removeHyperlink" }, { text: '清除内容 (Ctrl+Shift+J)', name: 'zCleanContent', workArea: 'viewport', command: "zCleanContent", iconClass:"ribbon-button-clearall" } ] }, { text: '数据有效性', name: 'zDataValidatorMenu', workArea: 'viewport', command: "zDataValidatorMenu", subMenu:[ { text: '数据有效性', name: 'zDataValidator', workArea: 'viewport', command: "zDataValidator", iconClass: "ribbon-button-datavalidation" }, { text: '清除校验', name: 'zCleanDataValidator', workArea: 'viewport', command: "zCleanDataValidator", iconClass: "ribbon-control-dropdown-clear-rules" }, ] }, { text: '公式', name: 'zFormulaMenu', workArea: 'viewport', command: "zFormulaMenu", subMenu:[ { text: '显示/隐藏公式(Ctrl+O)', name: 'zShowFormula', workArea: 'viewport', command: "zShowFormula", iconClass: "ribbon-show-formulas" }, { text: '工具栏增强(Ctrl+I)', name: 'zShowFormulaVal', workArea: 'viewport', command: "zShowFormulaVal", iconClass: "ribbon-button-textfunction" }, { text: '开启公式追踪', name: 'zRefRange', workArea: 'viewport', command: "zRefRange", iconClass: "gc-spread-link" } ] }, { text: '隐藏/显示', name: 'zVisibleMenu', workArea: 'viewport', command: "zVisibleMenu", subMenu:[ { text: '隐藏行列(Ctrl+Y)', name: 'zHideRowCol', workArea: 'viewport', command: "zHideRowCol", iconClass: "gc-spread-pivotCollapse" }, { text: '取消隐藏(Ctrl+U)', name: 'zShowRowCol', workArea: 'viewport', command: "zShowRowCol", iconClass: "gc-spread-pivotExpand" } ] }, { text: '插入', name: 'zInsertRowCol', workArea: 'viewport', command: "zInsertRowCol", subMenu:[ { text: '向后插入列', name: 'zInsertCol', workArea: 'viewport', command: "zInsertCol", iconClass:"gc-spread-tableInsertColumnsRight" }, { text: '向下插入行', name: 'zInsertRow', workArea: 'viewport', command: "zInsertRow", iconClass:"gc-spread-tableInsertRowsBelow" } ] }, { text: '冻结窗格', name: 'zFreezePaneMenu', workArea: 'viewport', command: "zFreezePaneMenu", subMenu:[ { text: '冻结窗格(Ctrl+E)', name: 'zFreezePane', workArea: 'viewport', command: "zFreezePane", iconClass:"ribbon-button-freezepane" }, { text: '冻结底部(Ctrl+B)', name: 'zFreezePaneTail', workArea: 'viewport', command: "zFreezePaneTail", iconClass:"ribbon-button-freezepane" }, { text: '取消冻结(Ctrl+M)', name: 'zUnFreezePane', workArea: 'viewport', command: "zUnFreezePane", iconClass:"ribbon-button-unfreezepane" } ] }, { text: '显示/隐藏表头(Ctrl+P)', name: 'zShowTableHeader', workArea: 'viewport', command: "zShowTableHeader", iconClass:"gc-spread-Totals" }, { text: '指标维度(Ctrl+Q)', name: 'zShowIndiDim', workArea: 'viewport', command: "zShowIndiDim", iconClass:"ribbon-control-dropdown-datalabels-show" } ] if(sp){ // 解锁单元格 sp.commandManager().register("zUnLockCell", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zUnLockCell"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); lockCell(false) Commands.endTransaction(context, options); return true; } } }) // isCtrl, isShift, isAlt, isMeta // ctrl? boolean 为true时, 命令需要 Ctrl 键; 若 false则不需要 // shift? boolean 为true时, 命令需要 Shift 键; 若 false则不需要 // alt? boolean 为true时, 命令需要 Alt 键; 若 false则不需要 // meta? boolean 为true时, 命令需要Mac上的Command键或Windows上的Windows键;若 false则不需要 sp.commandManager().setShortcutKey('zUnLockCell', 'K', true, false, false, false) // 锁定单元格 sp.commandManager().register("zLockCell", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zLockCell"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); lockCell(true) Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zLockCell', 'L', true, false, false, false) // 显示/隐藏公式 sp.commandManager().register("zShowFormula", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zShowFormula"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); isShowFormula() Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zShowFormula', 'O', true, false, false, false) // 工具栏显示公式和值 sp.commandManager().register("zShowFormulaVal", { canUndo: false, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zShowFormulaVal"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); showValueAndFormula() Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zShowFormulaVal', 'I', true, false, false, false) // 公式追踪 sp.commandManager().register("zRefRange", { canUndo: false, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zRefRange"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); turnOnFormulaRef() Commands.endTransaction(context, options); return true; } } }) // 数据有效性 sp.commandManager().register("zDataValidator", { canUndo: false, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zDataValidator"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); getDataValidator() Commands.endTransaction(context, options); return true; } } }) // 清除校验 sp.commandManager().register("zCleanDataValidator", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zCleanDataValidator"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); cleanDataValidator() Commands.endTransaction(context, options); return true; } } }) // 清除值 sp.commandManager().register("zCleanValue", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zCleanValue"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); setValue(null) Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zCleanValue', 'G', true, true, false, false) // 清除公式 sp.commandManager().register("zCleanFormula", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zCleanFormula"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); setFormula(undefined) Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zCleanFormula', 'H', true, true, false, false) // 清除内容 sp.commandManager().register("zCleanContent", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zCleanContent"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); setFormula(undefined) setValue(null) Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zCleanContent', 'J', true, true, false, false) // 隐藏行列 sp.commandManager().register("zHideRowCol", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zHideRowCol"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); setRowColVisible(false) Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zHideRowCol', 'Y', true, false, false, false) // 取消隐藏 sp.commandManager().register("zShowRowCol", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zShowRowCol"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); setRowColVisible(true) Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zShowRowCol', 'U', true, false, false, false) // 向后插入列 sp.commandManager().register("zInsertCol", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zInsertCol"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); insertCol(1) Commands.endTransaction(context, options); return true; } } }) // 向后插入行 sp.commandManager().register("zInsertRow", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zInsertRow"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); insertRow(1) Commands.endTransaction(context, options); return true; } } }) // 冻结窗格 sp.commandManager().register("zFreezePane", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zFreezePane"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); setFreezePane(true,1,1,0,0) Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zFreezePane', 'E', true, false, false, false) // 冻结尾行尾列 sp.commandManager().register("zFreezePaneTail", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zFreezePaneTail"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); setFreezePane(true,0,0,1,1) Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zFreezePaneTail', 'B', true, false, false, false) // 取消冻结 sp.commandManager().register("zUnFreezePane", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zUnFreezePane"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); setFreezePane(false,1,1,1,1) Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zUnFreezePane', 'M', true, false, false, false) // 显示/隐藏表头 sp.commandManager().register("zShowTableHeader", { canUndo: true, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zShowTableHeader"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); isShowTableHeader() Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zShowTableHeader', 'P', true, false, false, false) // 指标维度 sp.commandManager().register("zShowIndiDim", { canUndo: false, execute: function (context, options, isUndo) { let Commands = GC.Spread.Sheets.Commands; options.cmd = "zShowIndiDim"; if (isUndo) { Commands.undoTransaction(context, options); return true; } else { Commands.startTransaction(context, options); showIndiDim() Commands.endTransaction(context, options); return true; } } }) sp.commandManager().setShortcutKey('zShowIndiDim', 'Q', true, false, false, false) // 添加菜单 if(customMenu.length > 0){ for(let i = 0;i < customMenu.length;i++){ sp.contextMenu.menuData.push(customMenu[i]) } } } } function setFreezePane(isFreeze,row,col,trailingRow,trailingCol){ const sp = getSp() let sh = sp.getActiveSheet() let selCells = sh.getSelections() if(isFreeze){ if(selCells.length > 0){ if(row == 1){ sh.frozenRowCount(selCells[0].row) } if(col == 1){ sh.frozenColumnCount(selCells[0].col) } if(trailingRow == 1){ if(selCells[0].row != -1){ sh.frozenTrailingRowCount(sh.getRowCount() - selCells[0].row) } } if(trailingCol == 1){ if(selCells[0].col != -1){ sh.frozenTrailingColumnCount(sh.getColumnCount() - selCells[0].col) } } } }else{ if(row == 1){ sh.frozenRowCount(null) } if(col == 1){ sh.frozenColumnCount(null) } if(trailingRow == 1){ sh.frozenTrailingRowCount(null) } if(trailingCol == 1){ sh.frozenTrailingColumnCount(null) } } } function stopUpdate(sp){ sp.suspendPaint() sp.suspendEvent() sp.suspendCalcService(true) } function startUpdate(sp){ sp.resumeCalcService(true) sp.resumeEvent() sp.resumePaint() } /* end:SpreadJS */ })();