您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
条件に基づいてチェックボックスを一括操作
// ==UserScript== // @name 一括受発注チェック // @namespace http://tampermonkey.net/ // @version 1.02 // @description 条件に基づいてチェックボックスを一括操作 // @license MIT // @match *://plus-nao.com/forests/*/sku_check/* // @match *://plus-nao.com/forests/*/sku_edit/* // @grant GM_addStyle // @run-at document-end // ==/UserScript== (function () { 'use strict'; let selectedHorizontal = []; let selectedVertical = []; let horizontalAxisNames = []; let verticalAxisNames = []; const rows = document.querySelectorAll('table.formdot tbody tr'); rows.forEach(row => { const cells = row.querySelectorAll('td'); if (cells.length > 3) { const horizontal = cells[2].textContent.trim(); const vertical = cells[3].textContent.trim(); if (horizontal && !horizontalAxisNames.includes(horizontal)) { horizontalAxisNames.push(horizontal); } if (vertical && !verticalAxisNames.includes(vertical)) { verticalAxisNames.push(vertical); } } }); const buttonContainer = document.createElement('div'); buttonContainer.id = 'custom-button-container'; document.body.appendChild(buttonContainer); createAxisButtons('横軸', horizontalAxisNames, 'horizontal', buttonContainer); createAxisButtons('縦軸', verticalAxisNames, 'vertical', buttonContainer); const onOffContainer = document.createElement('div'); onOffContainer.id = 'on-off-container'; buttonContainer.appendChild(onOffContainer); const onButton = createActionButton('オン', () => toggleCheckboxes(true)); const offButton = createActionButton('オフ', () => toggleCheckboxes(false)); onOffContainer.appendChild(onButton); onOffContainer.appendChild(offButton); const hideButton = document.createElement('button'); hideButton.textContent = '-'; hideButton.id = 'hide-button'; buttonContainer.appendChild(hideButton); hideButton.onclick = hideContainer; const showButton = document.createElement('button'); showButton.textContent = '+'; showButton.id = 'show-button'; showButton.style.position = 'fixed'; showButton.style.right = '25px'; showButton.style.top = '50%'; showButton.style.transform = 'translateY(-50%)'; document.body.appendChild(showButton); showButton.onclick = showContainer; const configButton = document.createElement('button'); configButton.textContent = '⚙'; configButton.id = 'config-button'; buttonContainer.appendChild(configButton); configButton.onclick = () => { const isHidden = toggleRememberStateButton.style.display === 'none'; toggleRememberStateButton.style.display = isHidden ? 'block' : 'none'; }; const toggleRememberStateButton = document.createElement('button'); toggleRememberStateButton.textContent = getRememberState() ? '表示状態の記憶: オン' : '表示状態の記憶: オフ'; toggleRememberStateButton.id = 'toggle-remember-state'; toggleRememberStateButton.style.display = 'none'; toggleRememberStateButton.style.position = 'absolute'; toggleRememberStateButton.style.bottom = '-24px'; toggleRememberStateButton.style.left = '-2px'; toggleRememberStateButton.title = 'オン: リロード時は最後の表示状態を維持\nオフ: リロード時は常に展開'; buttonContainer.appendChild(toggleRememberStateButton); toggleRememberStateButton.onclick = toggleRememberState; window.addEventListener('load', restoreState); function createAxisButtons(label, axisNames, axis, container) { const axisContainer = document.createElement('div'); axisContainer.classList.add('axis-container'); const axisLabel = document.createElement('div'); axisLabel.textContent = label; axisLabel.classList.add('axis-label'); axisContainer.appendChild(axisLabel); axisNames.forEach(name => { const button = document.createElement('button'); button.textContent = name; button.classList.add('axis-button'); button.dataset.axis = axis; button.dataset.name = name; button.onclick = () => toggleSelection(button, axis, name); axisContainer.appendChild(button); }); container.appendChild(axisContainer); } function toggleSelection(button, axis, name) { if (axis === 'horizontal') { if (selectedHorizontal.includes(name)) { selectedHorizontal = selectedHorizontal.filter(item => item !== name); } else { selectedHorizontal.push(name); } } else if (axis === 'vertical') { if (selectedVertical.includes(name)) { selectedVertical = selectedVertical.filter(item => item !== name); } else { selectedVertical.push(name); } } updateButtonStyles(); } function updateButtonStyles() { document.querySelectorAll('.axis-button[data-axis="horizontal"]').forEach(button => { button.classList.toggle('selected', selectedHorizontal.includes(button.dataset.name)); }); document.querySelectorAll('.axis-button[data-axis="vertical"]').forEach(button => { button.classList.toggle('selected', selectedVertical.includes(button.dataset.name)); }); } function toggleCheckboxes(state) { let feedbackMessage = ''; rows.forEach(row => { const cells = row.querySelectorAll('td'); const checkbox = row.querySelector('td input[type="checkbox"]'); if (cells.length > 3 && checkbox) { const horizontal = cells[2].textContent.trim(); const vertical = cells[3].textContent.trim(); if (selectedHorizontal.length > 0 && selectedVertical.length > 0) { if (selectedHorizontal.includes(horizontal) && selectedVertical.includes(vertical)) { checkbox.checked = state; feedbackMessage = `「${selectedHorizontal.join('」「')}」 と 「${selectedVertical.join('」「')}」 の条件に一致する項目を変更しました。`; } } else if (selectedHorizontal.length > 0 && selectedVertical.length === 0) { if (selectedHorizontal.includes(horizontal)) { checkbox.checked = state; feedbackMessage = `「${selectedHorizontal.join('」「')}」 に一致する項目を変更しました。`; } } else if (selectedVertical.length > 0 && selectedHorizontal.length === 0) { if (selectedVertical.includes(vertical)) { checkbox.checked = state; feedbackMessage = `「${selectedVertical.join('」「')}」 に一致する項目を変更しました。`; } } } }); if (!feedbackMessage) { feedbackMessage = '選択条件がありません。'; } displayFeedback(feedbackMessage); } function createActionButton(label, callback) { const button = document.createElement('button'); button.textContent = label; button.classList.add('on-off-button'); button.onclick = callback; return button; } function displayFeedback(message) { let feedbackDiv = document.getElementById('feedback-message'); if (!feedbackDiv) { feedbackDiv = document.createElement('div'); feedbackDiv.id = 'feedback-message'; document.body.appendChild(feedbackDiv); } feedbackDiv.textContent = message; feedbackDiv.style.display = 'block'; setTimeout(() => { feedbackDiv.style.display = 'none'; }, 3000); } function hideContainer() { const container = document.getElementById('custom-button-container'); const showButton = document.getElementById('show-button'); container.style.display = 'none'; showButton.style.display = 'block'; if (getRememberState()) { localStorage.setItem('buttonContainerState', 'hidden'); } } function showContainer() { const container = document.getElementById('custom-button-container'); const showButton = document.getElementById('show-button'); container.style.display = 'grid'; showButton.style.display = 'none'; if (getRememberState()) { localStorage.setItem('buttonContainerState', 'visible'); } } function restoreState() { if (getRememberState()) { const savedState = localStorage.getItem('buttonContainerState'); const container = document.getElementById('custom-button-container'); const showButton = document.getElementById('show-button'); if (savedState === 'hidden') { container.style.display = 'none'; showButton.style.display = 'block'; } else { container.style.display = 'grid'; showButton.style.display = 'none'; } } } function toggleRememberState() { const currentState = getRememberState(); localStorage.setItem('rememberState', currentState ? 'false' : 'true'); toggleRememberStateButton.textContent = currentState ? '表示状態の記憶: オフ' : '表示状態の記憶: オン'; } function getRememberState() { return localStorage.getItem('rememberState') !== 'false'; } GM_addStyle(` #custom-button-container { position: fixed; top: 50%; right: 10px; min-width: 150px; transform: translateY(-50%); background-color: #fff; padding: 10px 20px; border: 1px solid #ccc; z-index: 1000; display: grid; grid-template-columns: 1fr 1fr; max-height: 90vh; } .axis-container { display: flex; flex-direction: column; overflow-y: auto; padding-bottom: 45px; max-height: 80vh; } .axis-label { margin-bottom: 3px; font-weight: bold; text-align: center; } .axis-button { margin: 3px; background-color: gray; color: white; border: none; padding: 3px 10px; cursor: pointer; text-align: center; } .axis-button.selected { background-color: #205668; color: white; } .axis-button:hover { background-color: #888; } .axis-button.selected:hover { background-color: #205668 !important; } #on-off-container { position: fixed; bottom: 0; left: 10px; right: 10px; background-color: #ffffff; padding: 10px; display: grid; grid-template-columns: 1fr 1fr; gap: 10px; border-top: 1px solid #ccc; z-index: 1001; } .on-off-button { background-color: #4c72af; color: white; padding: 5px 10px; border: none; cursor: pointer; transition: transform 0.1s ease, background-color 0.1s ease, box-shadow 0.1s ease; } .on-off-button:last-child { background-color: #f44336; } .on-off-button:active { transform: scale(0.95); background-color: #3b5a8e; box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.3); } .on-off-button:last-child:active { background-color: #d32f2f; box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.3); } .on-off-button:hover { background-color: #3c80b5; transition: background-color 0.3s; } .on-off-button:last-child:hover { background-color: #e53935; transition: background-color 0.3s; } #feedback-message { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); background-color: #4CAF50; color: white; padding: 10px; border-radius: 5px; z-index: 1002; } #hide-button { position: absolute; top: 0; left: 0; background-color: #ccc; color: white; border: none; padding: 2px 7px; cursor: pointer; } #config-button { position: absolute; top: 0; left: 22px; background-color: #ccc; color: white; border: none; padding: 1px 4px; cursor: pointer; } #hide-button, #config-button { position: absolute; background-color: #ccc; color: white; border: none; cursor: pointer; transition: background-color 0.3s, color 0.3s; } #hide-button:hover, #config-button:hover { background-color: #888; color: #fff; } #show-button { width: 40px; height: 40px; background: rgba(102, 204, 102, 0.5); backdrop-filter: blur(8px); border: 1px solid rgba(102, 204, 102, 0.4); border-radius: 50%; font-size: 26px; font-weight: bold; color: #fff; display: none; justify-content: center; align-items: center; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); pointer-events: auto; transform-origin: center; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3); opacity: 0; animation: fadeIn 0.5s forwards; } #show-button:hover { transform: scale(1.5); background: rgba(102, 204, 102, 0.8); font-size: 32px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } #showButton:active { transform: scale(1.35); background: rgba(102, 204, 102, 0.8); transition: transform 0.05s ease; } #showButton.fadeOut { animation: fadeOut 0.5s forwards; } @keyframes fadeIn { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } } @keyframes fadeOut { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.5); } } `); })();