使用Google Apps Script填充CVE描述遇阻:CVE ID未定义
问题解决:Google Apps Script 获取CVE描述时cveID未定义及函数调用问题
核心问题原因
- 错误执行子函数:你直接运行了
getCveSummary函数,该函数需要传入cveID参数,直接运行时参数为空,导致日志显示undefined,主函数populateCveSummaries并未被执行。 - 数据范围获取不合理:
sheet.getRange('A2:A')会获取A列整列(包含大量空行),循环时会读到空单元格的undefined值。
分步解决方案
1. 正确执行主函数
在Google Apps Script编辑器中,点击顶部的函数选择框,选择populateCveSummaries,再点击运行按钮,不要直接运行getCveSummary。
2. 修正数据范围与循环逻辑
修改populateCveSummaries函数,只获取A列有数据的行,避免空行干扰:
function getCveSummary(cveID) { var apiUrl = 'https://cve.circl.lu/api/cve/' + cveID; try { Logger.log('Fetching CVE summary for: ' + cveID); var response = UrlFetchApp.fetch(apiUrl); var json = JSON.parse(response.getContentText()); if (json && json.summary) { return json.summary; } else { return 'No summary available for this CVE'; } } catch (e) { Logger.log('Error fetching CVE summary for: ' + cveID + ' | Error: ' + e.message); return 'Error fetching CVE summary'; } } function populateCveSummaries() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var lastRow = sheet.getLastRow(); // 若A列无数据则直接返回 if (lastRow < 2) { Logger.log('No CVE IDs found in column A'); return; } // 仅获取A列从第2行到最后一行的有效数据范围 var dataRange = sheet.getRange(2, 1, lastRow - 1, 1); var data = dataRange.getValues(); Logger.log('Data retrieved from Column A: ' + JSON.stringify(data)); for (var i = 0; i < data.length; i++) { var cveID = data[i][0]; var rowNum = i + 2; Logger.log('Processing row ' + rowNum + ' - CVE ID: ' + cveID); if (cveID && cveID.trim() !== "") { var summary = getCveSummary(cveID); Logger.log('Summary fetched for ' + cveID + ': ' + summary); sheet.getRange(rowNum, 4).setValue(summary); } else { Logger.log('No valid CVE ID found in row ' + rowNum); sheet.getRange(rowNum, 4).clearContent(); // 清空对应D列单元格 } } }
3. 实现A列输入值时自动触发脚本
添加onEdit触发器函数,当编辑A列单元格时自动获取并填充CVE描述:
function onEdit(e) { var sheet = e.source.getActiveSheet(); var editedCell = e.range; // 仅当编辑A列(列索引1)、行号≥2且单元格有值时触发 if (editedCell.getColumn() === 1 && editedCell.getRow() >= 2 && editedCell.getValue()) { var cveID = editedCell.getValue().trim(); var rowNum = editedCell.getRow(); var summary = getCveSummary(cveID); sheet.getRange(rowNum, 4).setValue(summary); } }
注意:
onEdit是简单触发器,无需手动授权,只要编辑A列就会自动执行。如果后续遇到权限问题,可改为安装式触发器。
4. 安装式触发器设置(可选,应对权限问题)
如果onEdit出现权限错误,按以下步骤设置:
- 在脚本编辑器中,点击左侧的「触发器」图标(时钟形状)
- 点击「添加触发器」
- 选择函数:
onEdit - 选择事件类型:「从电子表格」→「编辑时」
- 保存并完成授权
内容的提问来源于stack exchange,提问作者Praveen K S
相关产品推荐
相关产品推荐

