如何从Google Sheets API访问回调函数的结果?

时间:2019-05-27 10:59:11

标签: node.js asynchronous google-api google-sheets-api

我正在使用Google Sheets API复制工作表,并且要将新工作表的ID传递给变量。

我可以在回调函数中成功获取工作表ID(使用result.data.sheetId),但是我很难在函数之外使用它。

我正在使用async / await语法,并且我也尝试过utils.promisify,但是没有运气!

async function copySheet(jwt, apiKey, spreadsheetId, range) {

  const sheets = google.sheets({ version: 'v4' });

  let newSheetId = await sheets.spreadsheets.sheets.copyTo({
    "spreadsheetId": spreadsheetId,
    "sheetId": 0,
    "auth": jwt,
    "key": apiKey,
    "resource": {
      "destinationSpreadsheetId": spreadsheetId,
    }
  }, function (err, result) {
    if (err) {
      throw err;
    }
    console.log(result.data.sheetId);
    return result.data.sheetId;
  });

  console.log(newSheetId);

}

第一个console.log显示我想要的号码,但是第二个记录undefined

您是否有建议让我在回调函数之外使用sheetId?

2 个答案:

答案 0 :(得分:1)

函数sheets.spreadsheets.sheets.copyTo不返回任何内容(undefined)。

您应该让函数返回一个承诺,以便await实际上等待结果:

async function copySheet (jwt, apiKey, spreadsheetId, range) {

  const sheets = google.sheets({ version: 'v4' })

  const newSheetId = await new Promise((resolve, reject) => {
    sheets.spreadsheets.sheets.copyTo({
      spreadsheetId: spreadsheetId,
      sheetId: 0,
      auth: jwt,
      key: apiKey,
      resource: {
        destinationSpreadsheetId: spreadsheetId,
      }
    }, function (err, result) {
      if (err) {
        reject(err)
      }
      resolve(result.data.sheetId)
    })
  })

  console.log(newSheetId);
}

答案 1 :(得分:1)

此修改如何?请认为这只是几个答案之一。

修改后的脚本:

请按如下所示修改脚本。

发件人:

let newSheetId = await sheets.spreadsheets.sheets.copyTo({
  "spreadsheetId": spreadsheetId,
  "sheetId": 0,
  "auth": jwt,
  "key": apiKey,
  "resource": {
    "destinationSpreadsheetId": spreadsheetId,
  }
}, function (err, result) {
  if (err) {
    throw err;
  }
  console.log(result.data.sheetId);
  return result.data.sheetId;
});

console.log(newSheetId);

收件人:

let res = await sheets.spreadsheets.sheets.copyTo({
  "spreadsheetId": spreadsheetId,
  "sheetId": 0,
  "auth": jwt,
  "key": apiKey,
  "resource": {
    "destinationSpreadsheetId": spreadsheetId,
  }
});

let newSheetId = res.data.sheetId;
console.log(newSheetId);

注意:

  • 根据您的问题,我可以确认您已经可以使用Sheets API。
  • spreadsheets.sheets.copyTo()使用POST方法。因此,在这种情况下,无法使用API​​密钥。我认为即使删除key: apiKey,该脚本也可以正常工作。

参考:

如果这不是您想要的结果,我表示歉意。