You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js更新Google Sheet数据报ReferenceError: row is not defined如何解决

错误原因

你代码的报错来源于sheet.js中updateDataFromSheets函数的这一行:

valueInputOption: row[6],

整个updateDataFromSheets函数的作用域内没有声明过row变量,直接调用就会抛出row is not defined的引用错误。
同时你调用Google Sheets API的用法还有几个逻辑问题:

  1. valueInputOption是Google Sheets API的固定参数,合法取值只有RAW(直接存储输入内容)和USER_ENTERED(按用户手动输入规则解析内容,自动识别公式、日期等),不需要也不能用自定义的row[6]赋值
  2. 你同时使用了await和回调函数处理update请求,属于冗余写法,选一种异步处理方式即可
  3. 目前你写死了更新的内容和范围,无法对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:06:03