Как использовать 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, не управляя секретами аутентификации.
Ответ 3
Я много часов просматриваю в Интернете, ища помощь о том, как интегрировать API Google Таблиц с облачными функциями Firebase.
К счастью, я нашел этот пост на Medium, который касается этой точной темы:
https://medium.com/@elon.danziger/fast-flexible-and-free-visualizing-newborn-health-data-with-firebase-nodejs-and-google-sheets-1f73465a18bc