【问题标题】:Importing data using ImportJSON to Google Sheets, select value output based on column name?使用 ImportJSON 将数据导入 Google 表格,根据列名选择值输出?
【发布时间】:2021-01-26 17:49:59
【问题描述】:

我正在尝试将 Yahoo Finance 中的财务数据导入 Google 表格。 我刚刚了解了 ImportJSON。

我通过此链接使用 ImportJSON:https://query2.finance.yahoo.com/v10/finance/quoteSummary/EDIT?modules=defaultKeyStatistics
我的电子表格的 A 列中有股票代码,我想从上面的链接中提取一个特定值以获取相应的代码。

我试过这个:=INDEX(ImportJSON("https://query2.finance.yahoo.com/v10/finance/quoteSummary/"& A2&"?modules=defaultKeyStatistics"),2,69)

但是,由于我得到的结果好坏参半,该列似乎与每个股票代码的值不同。
有没有办法让我使用列名而不是数字来索引?

【问题讨论】:

  • 很遗憾,我无法理解您的目标。我为此道歉。为了正确理解你的目标,我可以问你关于图像的示例输入和输出情况吗?

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

很复杂!

JSON 和类似电子表格的数据不太容易结合在一起,因为 JSON 本质上是嵌套的,这不容易以表格方式表示。通常,键每次都会以不同的顺序出现,这就是为什么您可能会得到不一致的结果。

出于这个原因,我建议您熟悉 Apps Script,因为它是一种与 JSON 交互的方式比通过表单函数更友好。这样您就可以轻松地按名称调用值,因为 JSON 毕竟是 JavaScript 对象表示法,而 Apps Script 是一种 JavaScript!

示例应用程序脚本

为了说明这一点,这是我刚刚编写的一个脚本,用于从您发布的特定 JSON 中提取数据。它也可以作为工作表中的功能。下面演示如何使用它:

/**
 * Returns 2D array of values. i.e.
 * Value, Raw, Fmt, LongFmt
 * sharesShort, 9890638, 9.89M, 9,890,638
 */
function getJsonValue(url) {
  // Fetch the JSON
  let response = UrlFetchApp.fetch(url);
  let text = response.getContentText();
  let json = JSON.parse(text);

  // Initialize the output array
  let output = [];

  // Navigate to where the main data is
  let stats = json.quoteSummary.result[0].defaultKeyStatistics

  // Adding headers to the output
  let header = ["Value", "Raw", "Fmt", "LongFmt"]
  output.push(header)

  // For each key in stats, add:
  // Value, Raw, Fmt, LongFmt
  for (let attribute in stats) {
    // initialize row array
    let row = [];
    // Add Value to array
    row.push(attribute);

    // Check if the contents of the attribute is an object, else add blank row
    if (typeof(stats[attribute]) == "object" && stats[attribute] != null) {
      // if the object contains raw, fmt, longfmt, then add to row, else add null
      "raw" in stats[attribute] ? row.push(stats[attribute].raw) : row.push(null)
      "fmt" in stats[attribute] ? row.push(stats[attribute].fmt) : row.push(null)
      "longFmt" in stats[attribute] ? row.push(stats[attribute].longFmt) : row.push(null)
    } else {
        row.push(null);
        row.push(null);
        row.push(null);
    }
    // Add row to output
    output.push(row)
  }
  // Return 2D array
  return output
}

你可以这样使用它:

或者在代码中:

function test() {
  
  let file = SpreadsheetApp.getActive();
  let sheet = file.getSheetByName("Sheet1");

  let output = getJsonValue("https://query2.finance.yahoo.com/v10/finance/quoteSummary/EDIT?modules=defaultKeyStatistics")

  let rows = output.length
  let cols = output[0].length
  let range = sheet.getRange(1,1,rows, cols)
  range.setValues(output)

}

这个脚本主要是让你自己适应,取决于你使用的 JSON 的结构。

参考文献

【讨论】:

  • 太棒了,这太完美了。我无法让它工作。我对这一切都很陌生。当我转到工具 > 脚本时,我添加脚本、运行它、授予它权限并保存它。但是,当我尝试激活工作表中的功能时,什么也没有出现。当我转到我的脚本编辑器项目部分时,看起来脚本没有链接到我的工作表。我做错了什么?
  • 工具> 在电子表格 编写脚本,对吗?当您说“什么都没有出现”时 - 没有错误或任何东西?它确实需要几秒钟,第一次有时可能需要更长的时间。此外,该脚本可能会作为一个单独的脚本出现,但只要它是从电子表格打开的,那么它就是“容器绑定”的。
  • 没有错误,没有。我在工作表中,单击工具 > 脚本,脚本编辑器会打开一个现有项目。我尝试创建一个新项目以及向现有项目添加一个新脚本。无论哪种方式都行不通。当我转到我的项目概述时,我可以看到新脚本未链接到工作表。这是我的工作表的副本:docs.google.com/spreadsheets/d/…,很抱歉,您可以尝试添加它以查看我是否做错了什么。
  • 我打开了你的脚本并用我的代码添加了一个新的gs 文件,然后创建了一个新工作表来演示它。您现在应该可以看到它了。
  • 天哪,我很笨。我以为您发布的两段代码是分开的,没有意识到我必须将两者都添加到脚本编辑器中......非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多