当某些值未检索到时,如何保护将数据放置在工作表中的位置?

How to protect the positions to place the data in the worksheet when some values are not retrieved?

我正在使用 CheerioGS 库:

ID → 1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0
项目 → https://github.com/tani/cheeriogs

我的完整代码(我完整地添加了它,以便他们可以在测试中使用它):

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())
    })
}

结果是:

由于某种原因,最后一列中的一些值没有被收集,所以这些值中的一些在工作表中的位置是错误的。

例如:如果没有收集到第一个值而收集到第二个值,则第二个将在该列的第 1 行,则它是错误的。

如何在未收集值的行中添加破折号 -

不是使用 Array.prototype.forEachRange.setValue 一次一列地逐个单元格填充,而是构建一个值数组数组,然后使用 [=12 一次添加所有值=].

为了做到这一点,不是一次从所有 tables (tbody) 中抓取一个单元格 (td),而是抓取整个 table ( tbody) 并检查所需的单元格/内容是否存在,如果不存在,则将空字符串 ('') 添加到正在构建的数组中的相应位置。

资源

您想迭代那些 tr。这将给出一个二维数组(未经测试)

$('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);

加载 Cheerio 对象后对零件所做的更改:

  1. 您需要收集所有数据,然后在 1 个请求中将其(setValues)写回 sheet,以减少脚本执行时间并提高性能。
  2. 您需要使用 Cheerio 循环行 (let rows = $('tbody > tr')),以便能够组合每行所需的值,以便它可以显示为展开中的一行sheet。

第二个更改更为重要,因为它使您能够在以后处理每行数据,例如排序、筛选等。