使用节点 js 创建 google 个电子表格
Create google spreadsheet with node js
我想在我的 alexa 技能中创建一个 google 文档 sheet,它是用 Node.js 编写的。我启用了 google API,我在亚马逊开发门户中设置了所需的范围,我实际上可以登录到 google 帐户(所以发布的代码的前几行似乎工作),我没有收到任何错误消息。但是 sheet 永远不会被创建。
现在的主要问题是是否有人可以看到我的代码中的问题。
但我还有一个我非常感兴趣的附加问题:由于我使用帐户链接,我无法在 Alexa 测试模拟器中尝试该代码,但必须先将其上传到 Alexa 运行 它,在那里我无法获得任何调试消息。如何以这种方式进行最佳调试?
if (this.event!== undefined)
{
if (this.event.session.user.accessToken === undefined)
{
this.emit(':tellWithLinkAccountCard','to start using this skill, please use the companion app to authenticate on Google');
return;
}
}
else
{
this.emit(':tellWithLinkAccountCard','to start using this skill, please use the companion app to authenticate on Google');
return;
}
var oauth2Client = new google.auth.OAuth2('***.apps.googleusercontent.com', '***', '***');
oauth2Client.setCredentials({
access_token: this.event.session.user.accessToken,
refresh_token: this.event.session.user.refreshToken
});
var services = google.sheets('v4');
services.spreadsheets.create({
resource : {properties:{title:"MySheet"}},
auth : oauth2Client
}, function(err,response) {
if( err ) {
console.log('Error : unable to create file, ' + err);
return;
} else {
console.dir(response);
}
});
编辑:我只手动尝试了下半部分,并且可以创建一个跨页sheet。所以问题似乎确实是用 "this.event.session.user.accessToken" 检索访问令牌。
我发现使用单元测试调试此类问题要容易得多。这允许在本地重新运行代码。我使用 NPM 和 Mocha,它可以更轻松地调试自定义和智能家居技能。网上关于如何使用NPM和Mocha测试Nodejs代码的资料很多,这里不再赘述。例如,参考 Big Nerd Ranch article。这会使最初设置项目变得有点复杂,但每次遇到错误时您都会很高兴。
在这个例子中,我将代码分成两半:
- 前半部分将处理来自 Alexa 的请求并提取令牌。
- 后半部分将使用令牌创建 Google 文档。我还会传递要创建的文档的名称。
我会先测试第二部分,传入一个有效的令牌(仅用于测试)和一个测试文档名称。当它起作用时,至少您会知道文档创建代码正在起作用,任何问题都必须与令牌有关或您如何获得它。
一旦成功,我就会为第一部分创建一个测试。
我将使用硬编码的 JSON 对象作为 'event' 传递,其中 event.session.user.accesToken 设置为第一个测试中使用的工作测试令牌:
'use strict';
var token = '<valid token obtained from google account>';
let testEvent = {
'session': {
'user': {
'accessToken': token
}
}
}
我想在我的 alexa 技能中创建一个 google 文档 sheet,它是用 Node.js 编写的。我启用了 google API,我在亚马逊开发门户中设置了所需的范围,我实际上可以登录到 google 帐户(所以发布的代码的前几行似乎工作),我没有收到任何错误消息。但是 sheet 永远不会被创建。
现在的主要问题是是否有人可以看到我的代码中的问题。
但我还有一个我非常感兴趣的附加问题:由于我使用帐户链接,我无法在 Alexa 测试模拟器中尝试该代码,但必须先将其上传到 Alexa 运行 它,在那里我无法获得任何调试消息。如何以这种方式进行最佳调试?
if (this.event!== undefined)
{
if (this.event.session.user.accessToken === undefined)
{
this.emit(':tellWithLinkAccountCard','to start using this skill, please use the companion app to authenticate on Google');
return;
}
}
else
{
this.emit(':tellWithLinkAccountCard','to start using this skill, please use the companion app to authenticate on Google');
return;
}
var oauth2Client = new google.auth.OAuth2('***.apps.googleusercontent.com', '***', '***');
oauth2Client.setCredentials({
access_token: this.event.session.user.accessToken,
refresh_token: this.event.session.user.refreshToken
});
var services = google.sheets('v4');
services.spreadsheets.create({
resource : {properties:{title:"MySheet"}},
auth : oauth2Client
}, function(err,response) {
if( err ) {
console.log('Error : unable to create file, ' + err);
return;
} else {
console.dir(response);
}
});
编辑:我只手动尝试了下半部分,并且可以创建一个跨页sheet。所以问题似乎确实是用 "this.event.session.user.accessToken" 检索访问令牌。
我发现使用单元测试调试此类问题要容易得多。这允许在本地重新运行代码。我使用 NPM 和 Mocha,它可以更轻松地调试自定义和智能家居技能。网上关于如何使用NPM和Mocha测试Nodejs代码的资料很多,这里不再赘述。例如,参考 Big Nerd Ranch article。这会使最初设置项目变得有点复杂,但每次遇到错误时您都会很高兴。
在这个例子中,我将代码分成两半:
- 前半部分将处理来自 Alexa 的请求并提取令牌。
- 后半部分将使用令牌创建 Google 文档。我还会传递要创建的文档的名称。
我会先测试第二部分,传入一个有效的令牌(仅用于测试)和一个测试文档名称。当它起作用时,至少您会知道文档创建代码正在起作用,任何问题都必须与令牌有关或您如何获得它。
一旦成功,我就会为第一部分创建一个测试。 我将使用硬编码的 JSON 对象作为 'event' 传递,其中 event.session.user.accesToken 设置为第一个测试中使用的工作测试令牌:
'use strict';
var token = '<valid token obtained from google account>';
let testEvent = {
'session': {
'user': {
'accessToken': token
}
}
}