首页 > 解决方案 > 如何等待谷歌电子表格调用并将其设置在 for 循环中

问题描述

要从谷歌电子表格中获取行,此代码将起作用:

this.sheetsService.spreadsheets.values.get({
  spreadsheetId,
  range,
}, (err, result) => {
  if (err) {
    // Handle error
    console.log(err);
  } else {
    const numRows = result.values ? result.values.length : 0;
    console.log(`${numRows} rows retrieved.`);
    //Here I can use my rows
  }
});

但是我怎么能等待这个功能完成呢?例子:

console.log("1");
this.sheetsService.spreadsheets.values.get({
  spreadsheetId,
  range,
}, (err, result) => {
  if (err) {
    // Handle error
    console.log(err);
  } else {
    console.log("2");
  }
});
console.log("3");

这很可能会打印 132。还有没有办法在当前范围之外获得结果和错误?

我可能的意思的伪代码(应该打印 123):

console.log("1"); //Print 1
var getRows = this.sheetsService.spreadsheets.values.get({
  spreadsheetId,
  range,
}
console.log("2"); //Print 2

if (getRows.err) {
    // Handle error
    console.log(getRows.err);
} else {
    const numRows = getRows.result.values ? getRows.result.values.length : 0;
    console.log(`${numRows} rows retrieved.`);
    console.log("3") //Print 3
}

编辑:我希望错误超出范围,所以我可以这样做:(如果工作表调用失败,代码为 429,程序将休眠 100sek 并再次尝试)伪代码:

for(var i = 1; i < 5; i++){
var getRows = this.sheetsService.spreadsheets.values.get({
  spreadsheetId,
  range,
}
console.log("2"); //Print 2

if (getRows.err) {
    // Handle error
    if(getRows.err.code === 429){
        console.log("Too many requests, try again in 100sek");
        await sleep(100000); //sleep function with 100sek
        continue
    }
    //Some other code here
} else {
    //logic for the results
    console.log("3") //Print 3
}
console.log("Finished");
}

所以 123 将被正确打印,如果调用失败,它将在 100sek 后重试,最多 5 次尝试。

标签: node.jsgoogle-apps-scriptgoogle-sheetsgoogle-sheets-apigoogle-api-nodejs-client

解决方案


您可以使用promises代替callbacksasync/await

片段:

console.log("1");
var i = 0;
function loop(){
if( ++i > 5 ) return; 
this.sheetsService.spreadsheets.values.get({
  spreadsheetId,
  range,
})
.then(result => {
    console.log(result);
    console.log("2");
})
.then(()=>console.log("3"))
.catch(err=>{
  console.log(err);
  if(err.code === 429){
     sleep(100000).then(loop) 
  }
})
}

参考:


推荐阅读