Estoy usando la biblioteca CheerioGS :
Identificación → 1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0
Proyecto → https://github.com/tani/cheeriogs
Mi código completo (lo agregué en su totalidad para que puedan usarlo en las pruebas):
function importdataweb() { const sheet = SpreadsheetApp.getActive().getSheetByName('Page_One'); sheet.getRange('A1:Z' + sheet.getMaxRows()).clear({contentsOnly: true, skipFilteredRows: true}); const url = 'http://www.futebolnatv.com.br/jogos-hoje/'; const contentText = UrlFetchApp.fetch(url).getContentText(); const $ = Cheerio.load(contentText); let elements = $('tbody > tr > th > h4 > b') elements.each((index, value) => { sheet.getRange(index+1, 1).setValue($(value).text().trim()) }) let elements_1 = $('tbody > tr > td > div:nth-child(1)') elements_1.each((index, value) => { sheet.getRange(index+1, 2).setValue($(value).text().trim()) }) let elements_2 = $('tbody > tr > td > div:nth-child(2)') elements_2.each((index, value) => { sheet.getRange(index+1, 3).setValue($(value).contents().last().text().trim()) }) let elements_3 = $('tbody > tr > td > div:nth-child(3)') elements_3.each((index, value) => { sheet.getRange(index+1, 4).setValue($(value).contents().last().text().trim()) }) let elements_4 = $('tbody > tr > td b:nth-child(2)') elements_4.each((index, value) => { sheet.getRange(index+1, 5).setValue($(value).text().trim()) }) }Algunos valores en la última columna por algún motivo no se recopilan, por lo que la posición de algunos de estos valores en la hoja de trabajo está en el lugar incorrecto.
Por ejemplo: si no se recoge el primer valor pero sí el segundo, el segundo estará en la fila 1 de la columna, entonces estaría mal.
¿Cómo podría agregar un guión - en las líneas que no se recopila el valor?
En lugar de usar Array.prototype.forEach y Range.setValue para llenar celda por celda, una columna a la vez, cree una matriz de matriz de valores y luego agregue todos los valores a la vez mediante Range.setValues .
Para hacer esto, en lugar de tomar una celda ( td ) de todas las tablas ( tbody ) a la vez, tome la tabla completa ( tbody ) y verifique si existe la celda/contenido requerido, si no, agregue una cadena vacía ( '' ) a la posición correspondiente en el Array que se está construyendo.
Recursos
Desea iterar esos tr. Esto dará una matriz 2d (no probada)
$('tr').get().map(tr => $(tr).find("h4,.col-md-12").get().map(el => $(el).text()))let data = []; let rows = $('tbody > tr'); rows.each((i, row) => { const newDataRow = [ $(row).find('th > h4 > b').text().trim(), $(row).find('td > div:nth-child(1)').text().trim(), $(row).find('td > div:nth-child(2)').contents().last().text().trim(), $(row).find('td > div:nth-child(3)').contents().last().text().trim(), $(row).find('td b:nth-child(2)').text().trim(), ]; data.push(newDataRow); }); // fill empty values data = data.map(row => row.map(el => el ? el : '-')); // write values to sheet const startRow = 1; const startCol = 1; const numRows = data.length; const numCols = data[0].length; sheet.getRange(startRow, startCol, numRows, numCols).setValues(data);Cambios realizados en parte después de cargar el objeto Cheerio:
setValues ) nuevamente en la hoja en 1 solicitud, para reducir el tiempo de ejecución del script y mejorar el rendimiento.let rows = $('tbody > tr') ) con Cheerio, para poder combinar los valores que necesita para cada fila para que pueda mostrarse como una fila en una hoja de cálculo.El segundo cambio es más importante, ya que le brinda la capacidad de trabajar con sus datos por fila más tarde, como ordenar, filtrar, etc.