0

我在 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中。你能指出我正确的方向吗?

4

1 回答 1

1

好吧,在写这篇文章的时候,我找到了正确的方法,而且很简单:

await dataSheetForSummary.addRows(rowsForSummary)

是的,这是很平常的事情:正确地写一个问题是为了找到解决方案;我会发布这个,以便在谷歌上搜索解决方案的人可以更快地找到它。

于 2021-06-22T15:35:13.430 回答