Как использовать API-интерфейсы Google в рамках облачной функции google

Я пробовал службу Google Cloud Functions, и я хочу читать и писать таблицы Google, но не могу найти примеров или способов сделать это.

Моя проблема связана с тем, что пример javascript для облачной функции Google:

exports.helloWorld = function helloWorld (req, res) {
  res.send('Hello ${req.body.name || 'World'}!');
};

Это работает, но я хочу сделать то, что Google имеет в качестве примера для чтения из электронной таблицы Google:

  gapi.load('client:auth2', initClient);

  function initClient() {
    gapi.client.init({
      discoveryDocs: DISCOVERY_DOCS,
      clientId: CLIENT_ID,
      scope: SCOPES
    }).then(function () {
      // Listen for sign-in state changes.
      gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);

      // Handle the initial sign-in state.
              gapi.client.sheets.spreadsheets.values.get({
      spreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms',
      range: 'Class Data!A2:E',
    }).then(function(response) {
      var range = response.result;
      if (range.values.length > 0) {
        appendPre('Name, Major:');
        for (i = 0; i < range.values.length; i++) {
          var row = range.values[i];
          // Print columns A and E, which correspond to indices 0 and 4.
          appendPre(row[0] + ', ' + row[4]);
        }
      } else {
        appendPre('No data found.');
      }
    }, function(response) {
      appendPre('Error: ' + response.result.error.message);
    });
    });
  }

Кто-нибудь знает, возможно ли это или пример, который показывает, как сделать что-то подобное этому?

Ответ 1

Вот как я это сделал с Google Cloud Functions. Я подумал, что OAuth не подойдет, поскольку облачные функции часто выполняются без присмотра. К счастью, есть служебные учетные записи, предназначенные для связи между компьютерами.


1. Создайте учетную запись службы в своем облачном проекте

enter image description here

enter image description here


2. Сохраните ключ учетной записи службы

На шаге 1 файл ключа в формате JSON был загружен на ваш компьютер. Сохраните его в каталоге вашего проекта и переименуйте в credentials.json.


3. Создайте ключ API

enter image description here


4. Сохраните ключ API

Скопируйте и сохраните ключ API из шага 3 в файле с именем api_key.json в каталоге вашего проекта. Это должно выглядеть так:

{
  "key": "<PASTE YOUR API KEY HERE>"
}

5. Предоставить доступ к электронной таблице учетной записи службы

Поделитесь электронной таблицей с адресом электронной почты учетной записи службы, созданной на шаге 1.

enter image description here


6. Позвоните в Google Sheets API

Вот мой код, который добавляет строку в таблицу каждый раз, когда вызывается облачная функция.

const {google} = require('googleapis');

exports.reply = (req, res) => {
  var jwt = getJwt();
  var apiKey = getApiKey();
  var spreadsheetId = '<PASTE YOUR SPREADSHEET ID HERE>';
  var range = 'A1';
  var row = [new Date(), 'A Cloud Function was here'];
  appendSheetRow(jwt, apiKey, spreadsheetId, range, row);
  res.status(200).type('text/plain').end('OK');
};

function getJwt() {
  var credentials = require("./credentials.json");
  return new google.auth.JWT(
    credentials.client_email, null, credentials.private_key,
    ['https://www.googleapis.com/auth/spreadsheets']
  );
}

function getApiKey() {
  var apiKeyFile = require("./api_key.json");
  return apiKeyFile.key;
}

function appendSheetRow(jwt, apiKey, spreadsheetId, range, row) {
  const sheets = google.sheets({version: 'v4'});
  sheets.spreadsheets.values.append({
    spreadsheetId: spreadsheetId,
    range: range,
    auth: jwt,
    key: apiKey,
    valueInputOption: 'RAW',
    resource: {values: [row]}
  }, function(err, result) {
    if (err) {
      throw err;
    }
    else {
      console.log('Updated sheet: ' + result.data.updates.updatedRange);
    }
  });
}

Надеюсь это поможет!

Ответ 2

Я нашел способ сделать это тем же способом с автоматической аутентификацией, что и другие службы.

В README NodeJS API у них есть пример автоматической аутентификации, который мы можем применить к Sheets API следующим образом:

index.js:

const { google } = require('googleapis');
const { promisify } = require('util');

exports.main = (req, res) => {
  google.auth.getClient({
    scopes: ['https://www.googleapis.com/auth/spreadsheets'],
  }).then(auth => {
    const api = google.sheets({ version: 'v4', auth });
    const getSheets = promisify(api.spreadsheets.get.bind(api.spreadsheets));
    return getSheets({ spreadsheetId: 'SPREADSHEET_ID' });
  })
    // This just prints out all Worksheet names as an example
    .then(({ data: { sheets } }) => {
      res.status(200).send({ sheets });
    })
    .catch(err => {
      res.status(500).send({ err });
    })
};

package.json:

{
  "dependencies": {
    "googleapis": "^42"
  }
}

Наконец, поделитесь листом с адресом электронной почты учетной записи службы, на которой запущена облачная функция.

google.auth.getClient в этом примере обнаружит учетные данные для учетной записи службы, подключенной к облачной функции. Таким образом, вы можете взаимодействовать с Sheets API, не управляя секретами аутентификации.