在 Google Cloud Functions 上使用 Google Sheets API,getClient() 不工作,函数超时
Using Google Sheets API on Google Cloud Functions, getClient() not working, function timesout
我一直在尝试让 Google Cloud Functions 使用 getClient() 自动获取默认服务帐户凭据,但是当我使用它时,该函数没有响应并最终超时。我现在使用 Google 表格 API 只是为了获得一个值。
我已确保授予服务帐户正确的访问权限,与服务电子邮件共享工作表,检查了我的依赖项。
我看到了一些使用 getClient 的答案和指南 (here and here),但我似乎无法让它工作,这是我的代码:
const {google} = require('googleapis');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
const PORT = process.env.PORT || 8080;
const SHEET_ID = "1ie8......lvnaKM";
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
app.get('/', (req, res) => {
let range = 'test2!B1';
getSheetsValue(SHEET_ID, range, res);
});
app.listen(PORT, () => { });
exports.sheetsTest = app;
async function getSheetsValue(sheetID, range, res) {
const authClient = await google.auth.getClient({
scopes: SCOPES,
});
console.log(authClient);
const sheets = google.sheets({
version: 'v4',
authClient
});
request = {
spreadsheetId: sheetID,
range: range,
};
try {
const result = await sheets.spreadsheets.values.get(request);
console.log(`result: ${JSON.stringify(result)}`);
console.log(`result.data: ${JSON.stringify(result.data)}`);
res.json(result.data.values[0]);
} catch (e) {
return e;
}
}
我什至按照此处的说明使用 google-auth-library 进行了尝试,但没有成功:https://github.com/googleapis/google-auth-library-nodejs#application-default-credentials
在那之前,将凭据硬编码到程序中是可行的,我只是希望弄清楚为什么这不起作用。理想情况下,我想使用隐式凭据
这里是 Google Cloud Functions 对我有用的代码:
const {google} = require('googleapis');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
const PORT = process.env.PORT || 8080;
const SHEET_ID = "SHEET_ID";
const CLIENT_EMAIL = "SERVICE_ACCOUNT_EMAIL";
const PRIVATE_KEY = "KEY"; //Credentials from the JSON file after downloading it
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
app.get('/', (req, res) => {
let range = 'test2!B1';
getValue(SHEET_ID, range, res);
});
app.listen(PORT, () => { });
exports.sheetsTest = app;
async function getValue(sheetID, range, res) {
let authClient = new google.auth.JWT(CLIENT_EMAIL, null, PRIVATE_KEY, SCOPES);
const sheets = google.sheets({
version: 'v4',
auth: authClient,
});
request = {
spreadsheetId: sheetID,
range: range,
}
try {
const result = await sheets.spreadsheets.values.get(request);
res.json(result.data.values[0]);
} catch (e) {
return e;
}
}
谢谢
首先你应该确保你已经在你的 PATH
中创建了一个名为 GOOGLE_APPLICATION_CREDENTIALS
的变量,它应该指向你的凭据 JSON
,如果你需要更多信息,你可以检查 here 如何操作。如果您不这样做,getClient()
将不起作用。
关于您的代码,您似乎在这里做了一些奇怪的事情:
const authClient = await google.auth.getClient({
scopes: SCOPES,
});
如果您查看您尝试使用的身份验证方法的 documentation,您会发现您的代码看起来不像那样。改成这样。
const auth = new GoogleAuth({
scopes: SCOPES
});
const authClient = await auth.getClient();
但现在您需要将此 class 添加到您的脚本中,因此请在 "imports" 上添加以下行:
const {GoogleAuth} = require('google-auth-library');
你最后一个错误是在你的这段代码中:
const sheets = google.sheets({
version: 'v4',
authClient
});
您似乎并没有真正告知 property
变量 authClient
指的是什么。所以你应该把它改成
const sheets = google.sheets({
version: 'v4',
auth: authClient
});
所以对我来说最终代码看起来像这样:
const {google} = require('googleapis');
const {GoogleAuth} = require('google-auth-library');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
const PORT = process.env.PORT || 8080;
const SHEET_ID = "<your sheet ID>";
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
app.get('/', (req, res) => {
let range = 'test2!B1';
getSheetsValue(SHEET_ID, range, res);
});
app.listen(PORT, () => { });
exports.sheetsTest = app;
async function getSheetsValue(sheetID, range, res) {
const auth = new GoogleAuth({
scopes: SCOPES
});
const authClient = await auth.getClient();
// console.log(authClient);
const sheets = google.sheets({
version: 'v4',
auth: authClient
});
request = {
spreadsheetId: sheetID,
range: range,
};
try {
const result = await sheets.spreadsheets.values.get(request);
console.log(`result: ${JSON.stringify(result)}`);
console.log(`result.data: ${JSON.stringify(result.data)}`);
res.json(result.data.values[0]);
} catch (e) {
console.log(e);
return e;
}
}
我一直在尝试让 Google Cloud Functions 使用 getClient() 自动获取默认服务帐户凭据,但是当我使用它时,该函数没有响应并最终超时。我现在使用 Google 表格 API 只是为了获得一个值。
我已确保授予服务帐户正确的访问权限,与服务电子邮件共享工作表,检查了我的依赖项。
我看到了一些使用 getClient 的答案和指南 (here and here),但我似乎无法让它工作,这是我的代码:
const {google} = require('googleapis');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
const PORT = process.env.PORT || 8080;
const SHEET_ID = "1ie8......lvnaKM";
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
app.get('/', (req, res) => {
let range = 'test2!B1';
getSheetsValue(SHEET_ID, range, res);
});
app.listen(PORT, () => { });
exports.sheetsTest = app;
async function getSheetsValue(sheetID, range, res) {
const authClient = await google.auth.getClient({
scopes: SCOPES,
});
console.log(authClient);
const sheets = google.sheets({
version: 'v4',
authClient
});
request = {
spreadsheetId: sheetID,
range: range,
};
try {
const result = await sheets.spreadsheets.values.get(request);
console.log(`result: ${JSON.stringify(result)}`);
console.log(`result.data: ${JSON.stringify(result.data)}`);
res.json(result.data.values[0]);
} catch (e) {
return e;
}
}
我什至按照此处的说明使用 google-auth-library 进行了尝试,但没有成功:https://github.com/googleapis/google-auth-library-nodejs#application-default-credentials
在那之前,将凭据硬编码到程序中是可行的,我只是希望弄清楚为什么这不起作用。理想情况下,我想使用隐式凭据
这里是 Google Cloud Functions 对我有用的代码:
const {google} = require('googleapis');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
const PORT = process.env.PORT || 8080;
const SHEET_ID = "SHEET_ID";
const CLIENT_EMAIL = "SERVICE_ACCOUNT_EMAIL";
const PRIVATE_KEY = "KEY"; //Credentials from the JSON file after downloading it
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
app.get('/', (req, res) => {
let range = 'test2!B1';
getValue(SHEET_ID, range, res);
});
app.listen(PORT, () => { });
exports.sheetsTest = app;
async function getValue(sheetID, range, res) {
let authClient = new google.auth.JWT(CLIENT_EMAIL, null, PRIVATE_KEY, SCOPES);
const sheets = google.sheets({
version: 'v4',
auth: authClient,
});
request = {
spreadsheetId: sheetID,
range: range,
}
try {
const result = await sheets.spreadsheets.values.get(request);
res.json(result.data.values[0]);
} catch (e) {
return e;
}
}
谢谢
首先你应该确保你已经在你的 PATH
中创建了一个名为 GOOGLE_APPLICATION_CREDENTIALS
的变量,它应该指向你的凭据 JSON
,如果你需要更多信息,你可以检查 here 如何操作。如果您不这样做,getClient()
将不起作用。
关于您的代码,您似乎在这里做了一些奇怪的事情:
const authClient = await google.auth.getClient({
scopes: SCOPES,
});
如果您查看您尝试使用的身份验证方法的 documentation,您会发现您的代码看起来不像那样。改成这样。
const auth = new GoogleAuth({
scopes: SCOPES
});
const authClient = await auth.getClient();
但现在您需要将此 class 添加到您的脚本中,因此请在 "imports" 上添加以下行:
const {GoogleAuth} = require('google-auth-library');
你最后一个错误是在你的这段代码中:
const sheets = google.sheets({
version: 'v4',
authClient
});
您似乎并没有真正告知 property
变量 authClient
指的是什么。所以你应该把它改成
const sheets = google.sheets({
version: 'v4',
auth: authClient
});
所以对我来说最终代码看起来像这样:
const {google} = require('googleapis');
const {GoogleAuth} = require('google-auth-library');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
const PORT = process.env.PORT || 8080;
const SHEET_ID = "<your sheet ID>";
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
app.get('/', (req, res) => {
let range = 'test2!B1';
getSheetsValue(SHEET_ID, range, res);
});
app.listen(PORT, () => { });
exports.sheetsTest = app;
async function getSheetsValue(sheetID, range, res) {
const auth = new GoogleAuth({
scopes: SCOPES
});
const authClient = await auth.getClient();
// console.log(authClient);
const sheets = google.sheets({
version: 'v4',
auth: authClient
});
request = {
spreadsheetId: sheetID,
range: range,
};
try {
const result = await sheets.spreadsheets.values.get(request);
console.log(`result: ${JSON.stringify(result)}`);
console.log(`result.data: ${JSON.stringify(result.data)}`);
res.json(result.data.values[0]);
} catch (e) {
console.log(e);
return e;
}
}