首页 > 解决方案 > 使用 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

先感谢您。

标签: javascriptgoogle-apps-scriptgoogle-sheetsgoogle-sheets-api

解决方案


有几个问题: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){}
  }
}

推荐阅读