当某些值未检索到时,如何保护将数据放置在工作表中的位置?
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.forEach
和 Range.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 个请求中将其(
setValues
)写回 sheet,以减少脚本执行时间并提高性能。
- 您需要使用 Cheerio 循环行 (
let rows = $('tbody > tr')
),以便能够组合每行所需的值,以便它可以显示为展开中的一行sheet。
第二个更改更为重要,因为它使您能够在以后处理每行数据,例如排序、筛选等。
我正在使用 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.forEach
和 Range.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 个请求中将其(
setValues
)写回 sheet,以减少脚本执行时间并提高性能。 - 您需要使用 Cheerio 循环行 (
let rows = $('tbody > tr')
),以便能够组合每行所需的值,以便它可以显示为展开中的一行sheet。
第二个更改更为重要,因为它使您能够在以后处理每行数据,例如排序、筛选等。