Drive API V3:使用 Google Apps 脚本(缺少 2 个字节)的多块可恢复上传文件大小错误

Drive API V3: wrong filesize on multiple-chunks resumable upload, using Google Apps script (2 bytes missing)

我有一个 Google 应用程序脚本网络应用程序,可以下载与任何 Youtube 频道的视频相关的数据,并将结果保存在用户 Google 驱动器上的 .CSV 文件中。以下是代码的主要步骤:

  1. 当用户点击浏览器中的按钮(使用 google.script.run)时,将调用 GAS 函数(名为 "X")。它在循环中查询 Youtube API,当 nextPageToken 为 null 或函数已 运行ning 大约 330 秒时停止循环(因为函数允许的最大 运行time 是在 GAS 中 6 分钟)。在这样做的同时,对于每个视频,我创建了一个 CSV 字符串,并将其推入一个数组(因此我有一个数组数组,我们称之为 "mainArr")。
  2. 当 X 成功停止后,它 returns mainArr 和另一个函数(名为 "Y")被调用,其目的是开始上传 "Utilities.newBlob(mainArr.join('\r\n'))" 在用户的驱动器上,一个块一个块地(每个块的大小为 256kb,除了最后一个,根据 the doc)。

现在这是我的问题:当 X 获取所有视频时,所有内容都很好地上传到云端硬盘。但是,如果我减少 X 的 运行ning 时间(例如 48 秒)并多次调用它(以及 Y)以获取所有视频,则会创建一个 CSV,它会丢失 2 个字节(每次迭代的字节数) , 它似乎)。因此,仅用一个 运行 X 和 Y 获得 576,845 个字节,我得到 (576,845 - (运行 个 Y) * 2) 个字节。这是有问题的,因为这意味着我的 .CSV 文件中缺少一些视频(我检查过)。

到目前为止,我将下载的字段限制为视频的 ID,以确保大小差异不是由某些数据更新引起的(例如,视频的观看次数有规律地增加) .我还检查了从 mainArr 创建块的函数不会破坏数据。它没有。

关于我如何多次调用 X 和 Y 的最后说明:当 X returns 时,Y 被调用,并逐块上传 mainArr,除了最后一个(名为 "lastChunk").当它完成工作时,它会清空 mainArr (mainArr = []) 和 returns mainArr 以及 base64 编码的 lastChunk。然后 X 又被调用一次。它向清空的 mainArr 提供一些新数据,然后 returns,传递 mainArr 和编码的 lastChunk。 Y 被调用,lastChunk 和 mainArr 的字节被拼接起来,然后将结果逐块上传。等等。

Y 的摘录,以突出刚刚描述的部分内容:

var csv = Utilities.newBlob(mainArr.join('\r\n'));
if (lastChunk) {
  csv = Utilities.newBlob((Utilities.base64DecodeWebSafe(lastChunk)).concat(csv.getBytes()));
}
var chunkSize = (256*1024); //as per the drive doc,
var fileBytes = csv.getBytes();
var fileSize = fileBytes.length
var chunksCount = Math.ceil(fileSize / chunkSize)
for (var i = 0; i < chunksCount; i++) {
  var chunk =  csv.setBytes(fileBytes.splice(0, chunkSize))
}

"While doing so, for each video, I create a CSV string that I push inside an array" -> 我推送了 CSV 字符串的字节而不是 CSV 字符串本身,一切正常。