javascript - 使用 Google App Script 从 API 中提取数据
问题描述
我希望有人可以提供帮助,因为我花了最后一天试图找出我哪里出错了......无济于事。
我正在尝试使用他们的 API(https://services.nvd.nist.gov/rest/json/cve/1.0/cve-id)从https://nvd.nist.gov/中提取一些基本信息。我需要提取 cve-id 的数据。cve-id 位于 A 列中。
示例 cve-id:https ://services.nvd.nist.gov/rest/json/cve/1.0/CVE-2019-9763
我想要的唯一信息是描述、cvssV3baseScore、cvss3vectorString。您可能会认为非常基本,但是在进行大量研究后我迷路了。
我尝试使用 Google Apps 脚本中的以下代码执行此操作:
function fetchData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("CVEs");
var sheetData = sheet.getDataRange().getValues();
var i, len = sheetData.length, row = [];
for (i = 1; i < len; i++) {
if (sheetData[i][0] == "" || sheetData[i][15] != "")
continue;
// sheetData[i][8] - here 8 represents column I as column A = 0. Column 23 = x, this is where sheet ends (at new Date())
let url = 'https://services.nvd.nist.gov/rest/json/cve/1.0/' + sheetData[i][0];
try {
var id = json.result.CVE_items.cve.CVE_data_meta.ID;
var idStr = '';
var response = UrlFetchApp.fetch(url).getContentText();
row.push([
idStr,
json.result.CVE_items.cve.CVE_data_meta.ID,
json.result.CVE_items.cve.description.description_data.value,
json.result.CVE_Items.impact.baseMetricV3.cvssV3.vectorString,
json.result.CVE_Items.impact.baseMetricV3.cvssV3.baseScore,
]);
//Here (middle number) 10 number denotes the exact column number from where we need to write data. 10 = J
sheet.getRange(i + 1, 2, 1, row[0].length).setValues(row);
}
catch (e) {
continue;
}
}
}
function lookupByNthValue(search_key, sourceColumn, targetColumn, n) {
if(arguments.length < 4){
throw new Error( "Only " + arguments.length + " arguments provided. Requires 4." );
}
var count = 1;
for(var i = 0; i < sourceColumn.length; i++){
if(sourceColumn[i] != search_key){
continue;
}
if(count == n){
return targetColumn[i];
}
count++;
}
}
function onOpen() {
SpreadsheetApp.getUi()
.createMenu("Actions")
.addItem("Fetch Data", 'fetchData')
.addToUi();
}
如果有人可以提供帮助,我将不胜感激,链接到 Google 表格:https ://docs.google.com/spreadsheets/d/18ilCE1udUM87c4YtxXAB52Fm3mEzDk8UggcH96S3JLA/edit?usp=sharing
先感谢您。
解决方案
有几个问题:len 等于 1000,因为您在第 1000 行有数据!因此脚本会太长。你用大写字母写 CVE_items 而不是 CVE_Items!CVE_Items 不是父项,它是一个数组,即使只出现一次。您永远不会解析 url fetch 的响应。尝试这个
function fetchData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("CVEs");
var sheetData = sheet.getDataRange().getValues();
var i, len = sheet.getLastRow(), row = [];
Logger.log(len)
for (i = 1; i < len; i++) {
try{
let url = 'https://services.nvd.nist.gov/rest/json/cve/1.0/' + sheetData[i][0];
var json = JSON.parse(UrlFetchApp.fetch(url).getContentText())
var row=[]
row.push([
json.result.CVE_Items[0].cve.CVE_data_meta.ID,
json.result.CVE_Items[0].cve.CVE_data_meta.ID,
json.result.CVE_Items[0].cve.description.description_data.value,
json.result.CVE_Items[0].impact.baseMetricV3.cvssV3.vectorString,
json.result.CVE_Items[0].impact.baseMetricV3.cvssV3.baseScore,
]);
Logger.log(row)
sheet.getRange(i + 1, 2, 1, row[0].length).setValues(row);
}catch(e){}
}
}
推荐阅读
- php - GetSQLValueString - Dreamweaver 生成的这个函数有什么用?
- simulink - SIMSCAPE 中的锂电池模型并行化错误
- java - 如何从 ImageView 列表中动态获取 imageview 并将该 imageview 放置到 imageview 变量中
- flutter - 尽管出现“必须选择至少一个平台”错误,如何创建颤振项目?
- rdf - rdf:List 和 co:List 的区别
- sql - 是否可以判断调用了哪个 Oracle 集群节点?
- jquery - 模态对话框上的 Oracle Apex 设置页面项
- sql - 仅当 BigQuery 中的其他列具有特定值时才选择值
- javascript - 在 Bootstrap v5.0.0-beta1 中,我可以将什么用于标签(BS 3/4)?
- javascript - 在 WP 编辑器中获取 Combobox 选择的值