我在 JS(节点)中编写了一个脚本,该脚本对来自多个工作表的数据执行一些操作,并在新工作表中生成摘要。摘要有超过 3K 行。首先,我尝试了一种简单的逐行保存方法:
for(let row of rowsForSummary)
await dataSheetForSummary.addRow(row)
但这会产生太多请求,并且在大约 70 个成功请求之后,另一个失败并显示状态 429 ( Quota exceeded for quota metric 'Write requests' and limit 'Write requests per minute per user' of service 'sheets.googleapis.com'
)。
作为一个简单的解决方法,我添加了一个带有进度报告的循环(嗯,它实际上在 TypeScript 中,但没关系):
let successCount = 0
const reportProgress = () => console.log(`saved ${successCount} out of ${rowsForSummary.length}`)
for(let row of rowsForSummary) {
let success = false
while(!success) {
try {
await dataSheetForSummary.addRow(row as any)
success = true
successCount++
} catch(e) {
// deal with requests-per-minute limit:
if(e.response?.status == 429) {
// wait 60 seconds
await new Promise(resolve => setTimeout(resolve, 60*1000))
reportProgress()
// retry
continue
} else {
console.error('failed to save row', e)
break
}
}
}
}
但这看起来和工作起来很尴尬:我必须等待相当长的时间,有一些额外的线路和逻辑。我忍不住问“我可以保存整个东西(工作表)而不是单独保存每一行吗? ”但还没有找到合适的方法,至少在node wrapper docs中。你能指出我正确的方向吗?