a continuación se muestra el código para eliminar columnas completas, excepto las columnas "G" y "M", utilizando un bucle for, pero el proceso es demasiado lento, ¿hay alguna manera de hacerlo más rápido?
var lastCol = newSheet.getLastColumn(); var keep = [7,13]; for (var col=lastCol; col > 0; col--) { if (keep.indexOf(col) == -1) { newSheet.deleteColumn(col); } }He aquí cómo hacerlo con la API de SpreadsheetApp:
function test() { const keep = [7, 13]; // columns G and M const newSheet = SpreadsheetApp.getActiveSheet(); deleteColumns_(newSheet, keep); } /** * Deletes all columns in sheet except the ones whose column numbers * are listed in columnsToKeep. * * The columnsToKeep array [1, 2, 7, 13] means that columns A, B, G and M * will remain while other columns are deleted. * * @param {Sheet} sheet The sheet where to delete columns. * @param {Number[]} columnsToKeep Array of column numbers to keep. */ function deleteColumns_(sheet, columnsToKeep) { // version 1.0, written by --Hyde, 13 June 2022 // - see https://stackoverflow.com/q/72600890/13045193 const columnsToDelete = []; for (let i = 1, maxColumns = sheet.getMaxColumns(); i <= maxColumns; i++) { if (!columnsToKeep.some(columnNumber => i === columnNumber)) { columnsToDelete.push(i); } } const tuples = getRunLengths_(columnsToDelete).reverse(); tuples.forEach(([columnStart, numColumns]) => sheet.deleteColumns(columnStart, numColumns)); } /** * Counts consecutive numbers in an array and returns a 2D array that * lists the first number of each run and the number of items in each run. * * The numbers array [1, 2, 3, 5, 8, 9, 11, 12, 13, 5, 4] will get * the result [[1, 3], [5, 1], [8, 2], [11, 3], [5, 1], [4, 1]]. * * For best results, sort the numbers array like this: * const runLengths = getRunLengths_(numbers.sort((a, b) => a - b)); * Note that duplicate values in numbers will give duplicates in result. * * @param {Number[]} numbers The numbers to group into runs. * @return {Number[][]} The numbers grouped into runs, or [] if the array is empty. */ function getRunLengths_(numbers) { // version 1.1, written by --Hyde, 31 May 2021 if (!numbers.length) { return []; } return numbers.reduce((accumulator, value, index) => { if (!index || value !== 1 + numbers[index - 1]) { accumulator.push([value]); } const lastIndex = accumulator.length - 1; accumulator[lastIndex][1] = (accumulator[lastIndex][1] || 0) + 1; return accumulator; }, []); }Creo que su objetivo es el siguiente.
En este caso, ¿qué tal si usamos Sheets API? Cuando se usa Sheets API, su secuencia de comandos es la siguiente. Pensé que cuando se usa Sheets API, el costo del proceso podría reducirse un poco.
Antes de usar este script, habilite Sheets API en los servicios avanzados de Google .
function myFunction() { var sheetName = "Sheet1"; // Please set the sheet name. var keep = [7, 13]; var ss = SpreadsheetApp.getActiveSpreadsheet(); var newSheet = ss.getSheetByName(sheetName); var lastCol = newSheet.getLastColumn(); // or newSheet.getMaxColumns() var sheetId = newSheet.getSheetId(); var requests = [...Array(lastCol)].reduce((ar, _, i) => { if (!keep.includes(i + 1)) { ar.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i + 1, dimension: "COLUMNS" } } }); } return ar; }, []).reverse(); if (requests.length == 0) return; Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId()); }var lastCol = newSheet.getLastColumn(); se usa En este caso, se utiliza el rango de datos. Si desea verificar todas las columnas, use var lastCol = newSheet.getMaxColumns(); en lugar de eso.