使用google-spreadsheet库时row.tgid始终为undefined问题求助
解决google-spreadsheet库中row.tgid始终为undefined的问题
可能的原因及解决方法
1. 表头名称与代码属性名不匹配
google-spreadsheet库默认将表格第一行的表头转换为驼峰式或小写属性名,如果你的表头格式特殊(带空格、全大写、含符号),实际属性名会和你预期的tgid不一致:
- 若表头是
TG ID,属性名会变为tgId; - 若表头有特殊字符,直接用原始表头字符串访问,比如
row['TG ID']。
验证方法:在循环内打印行的所有属性键,确认实际名称:
console.log(Object.keys(row));
2. 未正确指定表头行
如果表格的表头不在第一行,或者默认加载逻辑未识别到表头,会导致属性映射失败。可显式指定表头行:
const sheet = doc.sheetsByIndex[0]; // 设置表头所在的行号(表格内的实际行号,从1开始) sheet.headerRow = 1; const rows = await sheet.getRows();
3. 数据类型不匹配
即使视觉格式一致,id和表格中的tgid可能存在类型差异(比如一个是数字、一个是字符串),直接用===比较会不相等。统一转换类型后再比较:
if (String(row.tgid) === String(id)) { // 执行更新逻辑 }
4. 文档加载不完整
可在加载文档后打印表头信息,确认是否正确读取到tgid列:
await doc.loadInfo(); const sheet = doc.sheetsByIndex[0]; console.log('当前表头:', sheet.headerValues); // 打印表头数组,检查是否包含目标列 const rows = await sheet.getRows();
修改后的示例代码
async function statsUpdate(id, is_correct) { try { await doc.loadInfo(); const sheet = doc.sheetsByIndex[0]; sheet.headerRow = 1; // 明确指定表头行 console.log('当前表头:', sheet.headerValues); const rows = await sheet.getRows(); for (let i = 0; i < rows.length; i++) { const row = rows[i]; console.log('行属性列表:', Object.keys(row)); // 统一类型后匹配 if (String(row.tgid) === String(id)) { // 确保数值类型正确,避免字符串拼接 row.answers = (parseInt(row.answers) || 0) + 1; if (is_correct) { row.correct_answers = (parseInt(row.correct_answers) || 0) + 1; } await row.save(); console.log(`成功更新ID: ${id}的统计数据`); break; } } } catch (error) { console.error(`更新ID: ${id}时出错:`, error); } }
内容的提问来源于stack exchange,提问作者Minesweeper
相关产品推荐
相关产品推荐

