Node.js batchUpdate的有效负载语法
我正在节点应用程序中使用Node.js batchUpdate的有效负载语法,node.js,google-api,google-sheets-api,Node.js,Google Api,Google Sheets Api,我正在节点应用程序中使用googleapis模块。我使用的是版本21,但由于旧版本中存在安全漏洞,我刚刚更新到版本52 有几个突破性的变化。除了格式化日期/时间字符串之外,我已经克服了大多数困难。以下有效负载是否正确用于格式化单元格A11中的日期/时间值 const formatDate = (next) => { sheets.spreadsheets.batchUpdate({ auth: authClient, spreadsheetId: sheetId,
googleapis
模块。我使用的是版本21,但由于旧版本中存在安全漏洞,我刚刚更新到版本52
有几个突破性的变化。除了格式化日期/时间字符串之外,我已经克服了大多数困难。以下有效负载是否正确用于格式化单元格A11中的日期/时间值
const formatDate = (next) => {
sheets.spreadsheets.batchUpdate({
auth: authClient,
spreadsheetId: sheetId,
requestBody: {
requests: [{
"repeatCell": {
range: { sheetId: 0, startRowIndex: 10, endRowIndex: 11, startColumnIndex: 0, endColumnIndex: 1},
cell: { userEnteredFormat: { numberFormat: { "type": "DATE_TIME", "pattern": "ddd yyyy-mm-dd hh:mm" } } },
fields: "userEnteredFormat.numberFormat"
}
}]
}
}, (err, response) => {
// ...
next();
}
);
}
上述有效负载未返回任何错误,但未进行格式化。键是否为requestBody?以前我使用的是资源
在格式化日期之前,我使用async
执行身份验证:
const authClient = new google.auth.JWT(client_email, null, private_key, SCOPES, null);
const sheetId = "1vgiEnV8fU_MrnIy31fbPAzhHz.......";
function authenticate(next) {
authClient.authorize((err) => {
next(err);
}
}
const tasks = [ authenticate, insertRow, formatdate ];
require("async").series(tasks);
这里不包括insertRow的代码,但它可以正常工作。我认为您的脚本是正确的。“A11”的单元格格式随请求正文一起修改。在这种情况下,请求主体可以用于
requestBody
和resource
但请再次确认以下几点
spreadsheetId:sheetId的
必须是电子表格IDsheetId
- 在这种情况下,当将
放入单元格“A11”并运行脚本时,您可以看到修改后的单元格格式=now()
- 通过以下修改,您可以检查来自Sheets API的返回值
sheets.spreadsheets.batchUpdate( { auth: authClient, spreadsheetId: "spreadsheetId", // <--- Please check this. requestBody: { requests: [ { repeatCell: { range: { sheetId: 0, startRowIndex: 10, endRowIndex: 11, startColumnIndex: 0, endColumnIndex: 1, }, cell: { userEnteredFormat: { numberFormat: { type: "DATE_TIME", pattern: "ddd yyyy-mm-dd hh:mm", }, }, }, fields: "userEnteredFormat.numberFormat", }, }, ], }, }, (err, res) => { if (err) { console.log(err); return; } console.log(res.data); } );
我将
设置为includeSpreadsheetInResponse
,我可以在true
,官方文件说,数据中看到我正在处理的电子表格的正确标题。因此,电子表格ID和身份验证应该是正确的。我将更详细地检查响应以进行故障排除。请求中的
的语法是什么?“我试过responseRanges
,但似乎没有任何效果。”老家伙谢谢你的回答。给您带来不便,我深表歉意。从您的回复中,我可以理解,在您的脚本中,A11
是电子表格ID,而不是工作表ID。关于您的请求正文,我认为您的请求正文是正确的。因为在我的环境中,当我测试您的请求正文时,我可以确认sheetId
的单元格“A11”的格式已更改为模式sheetId:0
。为了正确了解您当前的情况,您能否在不提供个人信息的情况下提供整个脚本?“顺便问一下,关于请求中应答器的语法是什么?ddd yyyy mm dd hh:mm
。例如,在您的案例中,当使用限制了应答电子表格中包含的范围。仅当includeSpreadsheetInResponse为“true”时才有意义。
时,似乎会检索来自Sheet1的响应。但是在这种情况下,可能适合使用以下方法:spreadsheets.get.Thank,谢谢您的帮助。我用更多的代码更新了这个问题。这和你的例子一样。在“responseRanges”:[“Sheet1”],
中,我使用的id值类似于1VzMvq5G6jO3vSHJMRBQAI,,,,,,是驱动器url中找到的部分,而不是spreadSheetId
中的“选项卡”id。就在range.sheetId
之前,我正在执行一个updateBatch
操作。这很好,这意味着身份验证应该有效,不是吗?我使用Nodeappend
模块将要同步执行的任务按顺序排列。@Old Geezer感谢您的回复和添加更多信息。从您更新的问题中,我可以确认您正在使用服务帐户请求API。在这种情况下,您能否再次确认您检查的电子表格是否与服务帐户共享?当电子表格与服务帐户的电子邮件共享时,您可以使用浏览器直接检查更新的电子表格。这个怎么样?async
const client_email = "###"; // Please set here. const private_key = "###"; // Please set here. const spreadsheetId = "###"; // Please set here. const { google } = require("googleapis"); let jwtClient = new google.auth.JWT( client_email, null, private_key, ["https://www.googleapis.com/auth/spreadsheets"] ); jwtClient.authorize((err) => { if (err) console.log(err); }); const sheets = google.sheets({ version: "v4", auth: jwtClient }); sheets.spreadsheets.batchUpdate( { spreadsheetId: spreadsheetId, requestBody: { requests: [ { repeatCell: { range: { sheetId: 0, startRowIndex: 10, endRowIndex: 11, startColumnIndex: 0, endColumnIndex: 1, }, cell: { userEnteredFormat: { numberFormat: { type: "DATE_TIME", pattern: "ddd yyyy-mm-dd hh:mm", }, }, }, fields: "userEnteredFormat.numberFormat", }, }, ], }, }, (err, res) => { if (err) { console.log(err); return; } console.log(res.data); } );