【问题标题】:nodejs reading value in google spreadsheet with await/asyncnodejs在谷歌电子表格中使用等待/异步读取值
【发布时间】:2019-03-20 18:54:11
【问题描述】:

我正在使用 for 循环遍历谷歌电子表格中的工作表并访问每个工作表中的特定单元格。我有一个谷歌电子表格,里面有五张 Sheet1、Sheet2、..、Sheet5。如果我正在读取的单元格是 Value1,...,Value5,则该值。 我希望得到的结果显示如下:

Sheet1
Value1
Sheet2
Value2
:
Sheet5
Value5

但是我得到:

Sheet1
Undefined
Sheet2
Undefined
:
Sheet5
Undefined
Value1
Value2
:
Value5.

我意识到我需要使用 async/await,但无法立即使用 google.spreadsheet.get。 提前感谢您的任何指导。 我的代码:

function getData (auth) {
  var sheets = google.sheets('v4')
  sheets.spreadsheets.get(
    {
      auth: auth,
      spreadsheetId: sheet_id
    },
    (err, response) => {
      if (err) console.log('The API returned an error: ' + err)
    }
  )
  var no_sheets = response.data.sheets.length

  for (var i = 0; i < no_sheets; i++) {
    try {
      console.log(response.data.sheets[i].properties.title)
      var sheet_title = response.data.sheets[i].properties.title
      var cell_value = getCellValue(auth, sheet_title)
      console.log(cell_value)
    } catch (err) {
      console.log(err)
      continue
    }
  }
}

function getCellValue (auth, sheet_title) {
  sheets.spreadsheets.values.get(
    {
      auth: auth,
      spreadsheetId: sheet_id,
      range: sheet_title + '!A1:A1'
    },
    (err, response) => {
      if (err) {
        console.log('The API returned an error: ' + err)
        return
      }
      var rows = response.data.values
      if (rows.length === 0) {
        console.log('No data found.')
      } else {
        for (var i = 0; i < rows.length; i++) {
          var cell_value = rows[i]
        }
        console.log(cell_value)
        return cell_value
      }
    }
  )
}

【问题讨论】:

  • 看起来您在 for 循环内部进行 AJAX 调用,而不是在等待它们。对 Google Sheet API 的调用是异步的,因此您需要将函数定义为 async,然后在每次调用 Google Sheet API 时都定义为 await
  • 当使用 values.batchGet 方法时,您可以通过一个 API 调用从多个工作表中获取值。 developers.google.com/sheets/api/reference/rest/v4/…这对你的情况有用吗?
  • prithajnath 答案中的 async/await 语法仅适用于较新版本的 javascript。但是有一些旧的方法可以做同样的事情。 Nodejs v6 内置了 Promise 对象,对于早期版本,您可以从 bluebird 等库中获得 Promise。
  • Protip:日志行应该包含硬编码的字符串,这样当你阅读日志时你就可以知道它们来自哪里。例如:console.log('cell_value:', cell_value);。您目前拥有的日志令人困惑,因为它没有这个。

标签: javascript node.js google-sheets async-await google-sheets-api


【解决方案1】:

如果您想使用 async/await 而不是回调,则可以,因为 googleapi 返回 Promise。这些 Promise 是 async/await 的基础,也是之前的 goto。如果你使用 async/await 或 Promises,你的代码会更容易阅读和理解。

所以不要调用:

sheets.spreadsheets.get({
  auth: auth,
  spreadsheetId: sheet_id
},
(err, response) => {
  if (err) console.log('The API returned an error: ' + err)
});

你可以打电话:

try {
  const response = sheets.spreadsheets.get({
    auth: auth,
    spreadsheetId: sheet_id
  });
}
catch(err) {
  console.log('The API returned an error: ' + err);
}

问题是您只能在 async 函数中使用 await 关键字。您可以阅读有关 async/await here 的更多信息。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多