Next.js更新Google Sheet数据报ReferenceError: row is not defined如何解决
错误原因
你代码的报错来源于sheet.js中updateDataFromSheets函数的这一行:
valueInputOption: row[6],
整个updateDataFromSheets函数的作用域内没有声明过row变量,直接调用就会抛出row is not defined的引用错误。
同时你调用Google Sheets API的用法还有几个逻辑问题:
valueInputOption是Google Sheets API的固定参数,合法取值只有RAW(直接存储输入内容)和USER_ENTERED(按用户手动输入规则解析内容,自动识别公式、日期等),不需要也不能用自定义的row[6]赋值- 你同时使用了
await和回调函数处理update请求,属于冗余写法,选一种异步处理方式即可 - 目前你写死了更新的内容和范围,无法对应
dynamicid.js中需要更新的发件成功行,需要修改为支持传参的动态更新逻辑
修复后的代码
1. sheet.js
// 新增参数:rowIndex 要更新的行号(从0开始对应sheet的行索引),rowData 要更新的行内容数组 export async function updateDataFromSheets(rowIndex, rowData) { try { const target = ['https://www.googleapis.com/auth/spreadsheets']; const jwt = new google.auth.JWT( process.env.GOOGLE_SHEETS_CLIENT_EMAIL, null, (process.env.GOOGLE_SHEETS_PRIVATE_KEY || '').replace(/\\n/g, '\n'), target ); const sheets = google.sheets({ version: 'v4', auth: jwt }); const values = [rowData]; const resource = { values }; // range指定对应行的四列(对应你的Email、姓名、专业、Status四个字段,可根据实际列数调整) // 行号+2是因为sheet行从1开始算,你第一行是表头,数据行从第二行开始 const response = await sheets.spreadsheets.values.update({ spreadsheetId: process.env.SPREADSHEET_ID, range: `sheet!A${rowIndex + 2}:D${rowIndex + 2}`, valueInputOption: 'RAW', resource }); console.log('%d cells updated.', response.data.updatedCells); } catch (err) { console.log(err); } return []; }
2. dynamicid.js
调整异步逻辑,发邮件成功后再更新对应行的Status:
import { getDataFromSheets } from '../../../libs/sheets'; import sendmail from '../../../libs/ses/sendmail'; import { updateDataFromSheets } from '../../../libs/sheets'; export default async function handler(req, res) { try { const sheet = await getDataFromSheets(); // 遍历所有数据行 for (let i = 0; i < sheet.length; i++) { if (sheet[i].Status != 'Success') { // 调用发邮件 await sendmail(sheet[i].Email, sheet[i].Subject, sheet[i].Body); // 发件成功后更新该行Status为Success await updateDataFromSheets(i, [ sheet[i].Email, sheet[i].Name, // 这里替换为你实际的姓名字段名,和values顺序对应 sheet[i].Major, // 这里替换为你实际的专业字段名 'Success' ]); } } res.json({ status: 'success', message: 'email has been sent' }) } catch (err) { console.log(err) res.json({ status: 'fail', error: err }) } }
内容的提问来源于stack exchange,提问作者user17079934
相关产品推荐
相关产品推荐

