Как загрузить файлы на диск с помощью AppsScript и Promises, чтобы гарантировать, что файл был загружен до получения иде ⇐ Javascript
Как загрузить файлы на диск с помощью AppsScript и Promises, чтобы гарантировать, что файл был загружен до получения иде
Извините за плохой английский текст ;(
Я изо всех сил пытался создать функцию загрузки файла, которая использовала бы обещания для загрузки, а затем возвращала идентификатор файла.
Раньше я проводил пару исследований, и многие из них сработали нормально! Но когда я отправляю проект в производство, он вообще не работает.
Что мне нужно: функция, которая загружает файл на Google Диск, а затем возвращает идентификатор файла. Зная идентификатор файла, я смогу позже выполнить поиск на Google Диске и использовать этот файл в качестве вложения в MailApp.
Мой код:
function setupFileUrl(fileContent, fileName) { пусть contentType = fileContent.substring(5, fileContent.indexOf(';')); let bytes = Utilities.base64Decode(fileContent.substr(fileContent.indexOf('base64,') + 7)); пусть файл = Utilities.newBlob(bytes, contentType, fileName); пытаться { const addFile = sendFile(файл); вернуть [addedFile.getUrl(), addFile.getId()] } поймать (е) { пусть logSheet = SpreadsheetApp.openById(appSpreadsheetID).getSheetByName("журнал"); logSheet.appendRow([new Date(), user, e, "setupFileUrl при создании файла"]); вернуть е } } Это одна из многих попыток написания кода, которые я предпринял, но все они снова и снова возвращают одну и ту же проблему.
Каждый, кто пытался загрузить файл, создает в моем журнале запись, в которой говорится: Исключение: К сожалению, произошла ошибка сервера. Пожалуйста, подождите немного и повторите попытку. Исключение: неверный аргумент: id
Я понял, что происходит то, что идентификатор запрашивается без ожидания процесса загрузки, поэтому я попытался сделать это с помощью промисов, но промисы возвращают пустой объект "{}" вместо идентификатора файл.
function sendFilewithPromise(base64Data, nomeArq) { const SplitBase = base64Data.split(','), type = SplitBase[0].split(';')[0].replace('data:',''); const byteCharacters = Utilities.base64Decode(splitBase[1]); const ss = Utilities.newBlob(byteCharacters, type); ss.setName(nomeArq); вернуть новое обещание((разрешить,отклонить) =>{ пытаться{ папка const = DriveApp.getFolderById(driveFolderID) константный файл =folder.createFile(ss) разрешить (file.getId()) } поймать (ошибка) { отклонить (ошибка); } }).then(res => res.getId()) .then(uploadedFile => {return uploadedFile}) .catch((e) => { пусть logSheet = SpreadsheetApp.openById(appSpreadsheetID).getSheetByName("журнал"); logSheet.appendRow([new Date(), user, e, "setupFileUrl при чтении идентификатора и URL-адреса файла"]); вернуть е }) } Кто-нибудь знает, как это решить?
Извините за плохой английский текст ;(
Я изо всех сил пытался создать функцию загрузки файла, которая использовала бы обещания для загрузки, а затем возвращала идентификатор файла.
Раньше я проводил пару исследований, и многие из них сработали нормально! Но когда я отправляю проект в производство, он вообще не работает.
Что мне нужно: функция, которая загружает файл на Google Диск, а затем возвращает идентификатор файла. Зная идентификатор файла, я смогу позже выполнить поиск на Google Диске и использовать этот файл в качестве вложения в MailApp.
Мой код:
function setupFileUrl(fileContent, fileName) { пусть contentType = fileContent.substring(5, fileContent.indexOf(';')); let bytes = Utilities.base64Decode(fileContent.substr(fileContent.indexOf('base64,') + 7)); пусть файл = Utilities.newBlob(bytes, contentType, fileName); пытаться { const addFile = sendFile(файл); вернуть [addedFile.getUrl(), addFile.getId()] } поймать (е) { пусть logSheet = SpreadsheetApp.openById(appSpreadsheetID).getSheetByName("журнал"); logSheet.appendRow([new Date(), user, e, "setupFileUrl при создании файла"]); вернуть е } } Это одна из многих попыток написания кода, которые я предпринял, но все они снова и снова возвращают одну и ту же проблему.
Каждый, кто пытался загрузить файл, создает в моем журнале запись, в которой говорится: Исключение: К сожалению, произошла ошибка сервера. Пожалуйста, подождите немного и повторите попытку. Исключение: неверный аргумент: id
Я понял, что происходит то, что идентификатор запрашивается без ожидания процесса загрузки, поэтому я попытался сделать это с помощью промисов, но промисы возвращают пустой объект "{}" вместо идентификатора файл.
function sendFilewithPromise(base64Data, nomeArq) { const SplitBase = base64Data.split(','), type = SplitBase[0].split(';')[0].replace('data:',''); const byteCharacters = Utilities.base64Decode(splitBase[1]); const ss = Utilities.newBlob(byteCharacters, type); ss.setName(nomeArq); вернуть новое обещание((разрешить,отклонить) =>{ пытаться{ папка const = DriveApp.getFolderById(driveFolderID) константный файл =folder.createFile(ss) разрешить (file.getId()) } поймать (ошибка) { отклонить (ошибка); } }).then(res => res.getId()) .then(uploadedFile => {return uploadedFile}) .catch((e) => { пусть logSheet = SpreadsheetApp.openById(appSpreadsheetID).getSheetByName("журнал"); logSheet.appendRow([new Date(), user, e, "setupFileUrl при чтении идентификатора и URL-адреса файла"]); вернуть е }) } Кто-нибудь знает, как это решить?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как применить свой AppsScript только к одной вкладке моей электронной таблицы?
Anonymous » » в форуме JAVA - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как применить свой AppsScript только к одной вкладке моей электронной таблицы?
Anonymous » » в форуме Javascript - 0 Ответы
- 1 Просмотры
-
Последнее сообщение Anonymous
-