如何获取Smartsheet字段名以实现Apps Script与Google Sheets集成?
解决Smartsheet数据拉取到Google Sheets的字段名问题
核心问题分析
- API响应结构误判:Smartsheet Sheets API的响应里,行数据存储在
rows字段,而非你代码里的records,这会导致speakers为空或undefined。 - 特殊属性名引用错误:
E-Number包含连字符,不能用点语法(fields.E-Number)访问,JS会将其解析成减法运算,必须用方括号语法。 - 数据结构理解偏差:Smartsheet返回的行数据中,单元格是
cells数组,每个cell通过columnId关联列,不是直接以列名为属性的fields对象。
修正后的完整代码
function getSpeakers() { // 获取Smartsheet数据及列映射 const { rows, columnMap } = requestsmartsheet(); const speakerInfo = []; // 遍历每一行,根据列名提取数据 rows.forEach(row => { // 构建当前行的字段映射 const rowFields = {}; row.cells.forEach(cell => { const columnName = columnMap[cell.columnId]; if (columnName) { rowFields[columnName] = cell.value; } }); // 按需求提取字段,注意特殊字段用方括号 speakerInfo.push([ rowFields.FirstName, rowFields.LastName, rowFields.Email, rowFields['E-Number'] ]); }); console.log("speaker_info: ", speakerInfo); // 可选:将数据写入Google Sheets // const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // sheet.getRange(1, 1, speakerInfo.length, speakerInfo[0].length).setValues(speakerInfo); } function requestsmartsheet() { const sheetId = "[你的Sheet ID]"; const token = "[你的API Token]"; const url = `https://api.smartsheet.com/2.0/sheets/${sheetId}`; const options = { headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json" }, method: "GET" }; const response = UrlFetchApp.fetch(url, options); const result = JSON.parse(response.getContentText()); // 建立列名到columnId的映射 const columnMap = {}; result.columns.forEach(column => { columnMap[column.id] = column.title; }); // 返回行数据和列映射 return { rows: result.rows, columnMap }; }
关键修正说明
- 修正API响应解析:
- 从
result.rows获取行数据,而非不存在的records。 - 新增
columnMap,将列的id映射为列名,方便后续通过列名匹配对应单元格。
- 从
- 正确处理特殊属性名:
- 对于带连字符的列名
E-Number,使用rowFields['E-Number']语法访问。
- 对于带连字符的列名
- 正确解析单元格数据:
- 遍历每行的
cells数组,通过columnMap把columnId转为列名,构建行数据的字段映射后再提取所需值。
- 遍历每行的
内容的提问来源于stack exchange,提问作者Allister Lobo
相关产品推荐
相关产品推荐

