Я звоню из скрипта Google Apps.
У меня странная проблема. Для создания пакетирование выполняется очень быстро (например, 4 секунды для 20 записей, и я не пробовал больше).
Копирование файла, однако, происходит очень медленно. Он получает время пакетного API, если имеется более 20 записей, и эти 20 записей занимают около 58 секунд. Таким образом, 3 секунды на файл, что (после многих часов работы) - та же скорость, которую я получаю с базовыми вызовами for и driveapp.copy. Хуже, на самом деле, потому что, по крайней мере, если я использую цикл for, я могу работать в течение 30 минут, а не 60 секунд.
Есть ли способ ускорить его? Что-то, о чем я не имею в виду?
function COPYBATCH(dictionary) {
var body = [];
for (var key in dictionary)
{
var object = {
method: "POST",
endpoint: "https://www.googleapis.com/drive/v3/files/"+dictionary[key].source+"/copy",
requestBody: {
"parents": [
dictionary[key].parent,
],
"name": key
}
};
body.push(object);
}
Logger.log(body.length);
var boundary = "xxxxxxxxxx";
var contentId = 0;
var data = "--" + boundary + "\r\n";
for (var i in body) {
data += "Content-Type: application/http\r\n";
data += "Content-ID: " + ++contentId + "\r\n\r\n";
data += body[i].method + " " + body[i].endpoint + "\r\n";
data += body[i].requestBody ? "Content-Type: application/json; charset=utf-8\r\n\r\n" : "\r\n";
data += body[i].requestBody ? JSON.stringify(body[i].requestBody) + "\r\n" : "";
data += "--" + boundary + "\r\n";
}
var payload = Utilities.newBlob(data).getBytes();
var options = {
method: "post",
contentType: "multipart/mixed; boundary=" + boundary,
payload: payload,
headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()},
muteHttpExceptions: true,
};
var res = UrlFetchApp.fetch("https://www.googleapis.com/batch/drive/v3", options).getContentText();
Logger.log(res);
return parseResponseArray(res,dictionary);
}
Вещи, которые я пробовал: у меня изначально была пакетная загрузка из / batch /, но я нашел на странице рекомендаций для API gmail, что это должно бытьболее конкретно. Ответ включает в себя только fileid, имя и mimetype, поэтому ограничение возвращаемых полей не выглядит, как SEEM, очень полезным.
Фактически, ограничение на "https://www.googleapis.com/drive/v3/files/"+dictionary[key].source+"/copy?fields=id,name",
, похоже, дало мне еще несколько записей в минуту, но не так много, я все еще не могу скопировать 30 файлов, пока он не превысил тайм-аут API.