私はGoogleのCloud Functionsサービスを試していますが、Googleスプレッドシートを読み書きしたいのですが、これを行う例や方法が見つからないようです。
私の問題は、Googleクラウド関数のサンプルJavaScriptが次のとおりであるという事実から生じます。
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);
});
});
}
これが可能かどうか、またはこれに似た方法を実行する方法を示す例を誰かが知っていますか?
これがGoogle Cloud Functionsでどのように実行したかです。 Cloud Functionsは無人で実行されることが多いため、OAuthは適していません。幸い、サービスアカウント、マシン間通信用です。
手順1では、JSON形式のキーファイルがコンピューターにダウンロードされました。それをプロジェクトディレクトリに保存し、名前をcredentials.json
に変更します。
手順3のAPIキーをコピーして、プロジェクトディレクトリのapi_key.json
というファイルに保存します。次のようになります。
{
"key": "<PASTE YOUR API KEY HERE>"
}
手順1で作成したサービスアカウントのメールとスプレッドシートを共有します。
Cloud Functionが呼び出されるたびにスプレッドシートに行を追加するコードを次に示します。
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);
}
});
}
お役に立てれば!
他のサービス ができるのと同じ自動認証された方法でこれを行う方法を見つけました。
NodeJS APIのREADMEに、 auto-auth example があり、次のように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
その例では、Cloud Functionにアタッチされているサービスアカウントの認証情報を検出します。そのため、認証シークレットを管理する必要なくSheets APIを操作できます。
Google Sheets APIをFirebase Cloud Functionsと統合する方法についてのヘルプを探して、何時間もウェブを閲覧してきました。
幸い、私はこの正確なトピックを扱っているこの投稿をMediumで見つけました: