Greasy Fork is available in English.
Automatically download all Excel files in ranges
当前为
// ==UserScript==
// @name Auto Download Excel Files
// @namespace http://tampermonkey.net/
// @version 4.3
// @description Automatically download all Excel files in ranges
// @author srana
// @match *://orbis-r1-bvdinfo-com.sussex.idm.oclc.org/*
// @run-at document-idle
// ==/UserScript==
(function () {
'use strict';
const totalDocuments = 209890; // Total document count
const increment = 2000; // Number of documents per range
let currentStart = 1; // Starting point for the range
// Function to wait for an element to appear in the DOM
function waitForElement(selector, callback) {
const observer = new MutationObserver(() => {
const element = document.querySelector(selector);
if (element) {
observer.disconnect();
callback(element);
}
});
observer.observe(document.body, { childList: true, subtree: true });
}
// Function to set the range in input fields
function setRange(start, end) {
console.log(`Setting range: ${start} to ${end}`);
const fromInput = document.querySelector('input[name="component.From"]');
const toInput = document.querySelector('input[name="component.To"]');
if (fromInput && toInput) {
fromInput.value = start;
toInput.value = end;
// Trigger input events to simulate user interaction
fromInput.dispatchEvent(new Event('input'));
toInput.dispatchEvent(new Event('input'));
console.log(`Range set: From ${start}, To ${end}`);
return true;
} else {
console.error('Range input fields not found!');
return false;
}
}
// Function to click the "Export" button
function clickExportButton() {
const exportButton = document.querySelector('a.button.submit.ok');
if (exportButton) {
console.log('Clicking the Export button...');
exportButton.click();
} else {
console.error('Export button not found!');
}
}
// Function to close the popup
function closePopup() {
const closeBtn = document.querySelector('.close.px16');
if (closeBtn) {
console.log('Closing the popup...');
closeBtn.click();
} else {
console.error('Close button not found!');
}
}
// Function to process the current range
async function processCurrentRange() {
const end = Math.min(currentStart + increment - 1, totalDocuments);
// Set the range and trigger export
if (setRange(currentStart, end)) {
clickExportButton();
// Wait for the download popup to process
console.log('Waiting for download popup...');
await new Promise(resolve => setTimeout(resolve, 5000)); // Adjust delay as needed
// Close the popup after the export starts
closePopup();
// Wait before starting the next iteration
console.log('Waiting 5 seconds before next iteration...');
await new Promise(resolve => setTimeout(resolve, 5000)); // Adjust delay as needed
currentStart += increment;
// Continue processing the next range if within total documents
if (currentStart <= totalDocuments) {
startNextIteration();
} else {
console.log('All ranges processed!');
}
} else {
console.error(`Failed to set range for ${currentStart} to ${end}. Skipping...`);
}
}
// Function to start the next iteration
function startNextIteration() {
console.log(`Starting next iteration: ${currentStart} to ${Math.min(currentStart + increment - 1, totalDocuments)}`);
// Click the Excel button to reopen the popup
const excelButton = document.querySelector('[data-format="ExcelDisplay2007"]');
if (excelButton) {
excelButton.click();
// Wait for the dropdown to appear and select the range
waitForElement('#component_RangeOptionSelectedId', rangeSelector => {
rangeSelector.value = 'Range';
rangeSelector.dispatchEvent(new Event('change'));
console.log('Range option selected in dropdown.');
// Process the current range
processCurrentRange();
});
} else {
console.error('Excel export button not found!');
}
}
// Main function to start the automation
function startAutomation() {
console.log('Starting automation...');
// Click the initial Excel button to open the popup
const excelButton = document.querySelector('[data-format="ExcelDisplay2007"]');
if (excelButton) {
excelButton.click();
console.log('Excel export button clicked.');
// Wait for the dropdown to appear and select the range
waitForElement('#component_RangeOptionSelectedId', rangeSelector => {
rangeSelector.value = 'Range';
rangeSelector.dispatchEvent(new Event('change'));
console.log('Range option selected in dropdown.');
// Start processing the first range
processCurrentRange();
});
} else {
console.error('Excel export button not found!');
}
}
// Wait for the page to load completely, then start automation
window.addEventListener('load', () => {
waitForElement('[data-format="ExcelDisplay2007"]', startAutomation);
});
})();