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的
    sheetId
    必须是电子表格ID

  • 在这种情况下,当将
    =now()
    放入单元格“A11”并运行脚本时,您可以看到修改后的单元格格式

  • 通过以下修改,您可以检查来自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
    ,但似乎没有任何效果。”老家伙谢谢你的回答。给您带来不便,我深表歉意。从您的回复中,我可以理解,在您的脚本中,
    sheetId
    是电子表格ID,而不是工作表ID。关于您的请求正文,我认为您的请求正文是正确的。因为在我的环境中,当我测试您的请求正文时,我可以确认
    sheetId:0
    的单元格“A11”的格式已更改为模式
    ddd yyyy mm dd hh:mm
    。为了正确了解您当前的情况,您能否在不提供个人信息的情况下提供整个脚本?“顺便问一下,关于请求中应答器的语法是什么?
    ,官方文件说,
    限制了应答电子表格中包含的范围。仅当includeSpreadsheetInResponse为“true”时才有意义。
    。例如,在您的案例中,当使用
    “responseRanges”:[“Sheet1”],
    时,似乎会检索来自Sheet1的响应。但是在这种情况下,可能适合使用以下方法:spreadsheets.get.Thank,谢谢您的帮助。我用更多的代码更新了这个问题。这和你的例子一样。在
    spreadSheetId
    中,我使用的id值类似于1VzMvq5G6jO3vSHJMRBQAI,,,,,,是驱动器url中找到的部分,而不是
    range.sheetId
    中的“选项卡”id。就在
    updateBatch
    之前,我正在执行一个
    append
    操作。这很好,这意味着身份验证应该有效,不是吗?我使用Node
    async
    模块将要同步执行的任务按顺序排列。@Old Geezer感谢您的回复和添加更多信息。从您更新的问题中,我可以确认您正在使用服务帐户请求API。在这种情况下,您能否再次确认您检查的电子表格是否与服务帐户共享?当电子表格与服务帐户的电子邮件共享时,您可以使用浏览器直接检查更新的电子表格。这个怎么样?
    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);
      }
    );