#javascript #google-apps-script #file-upload #invalid-argument
#javascript #google-apps-script #загрузка файла #недопустимый аргумент
Вопрос:
Я пытаюсь загрузить файл «pdf» на Google Диск с помощью Google app script, но при нажатии кнопки я получаю сообщение об ошибке. Кроме того, я хотел использовать байты массива, но я не знаю, как это сделать, потому что без байтов массива я должен отключить chrome v8.
Сообщение об ошибке :
2495449455-mae_html_user_bin_i18n_mae_html_user__ar.js:56 Неперехваченный InvalidArgumentError: сбой из-за недопустимого значения в свойстве: 0
<!DOCTYPE html>
<html lang="en">
<head>
<base target="_self">
<?!=include('css');?>
<!--Import Google Icon Font-->
<link href="https://fonts.googleapis.com/icon?family=Material Icons" rel="stylesheet">
<!--Import materialize.css-->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!--Let browser know website is optimized for mobile-->
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title> PDF Collector</title>
<div align="center">
<p><img class="responsive-img offset-m3 s12 "
src=""></p>
</div>
</head>
<body>
<div id="msg" class="col m6 offset-m3 s12" align="center" style='color: red' >
<div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col m6 offset-m3 s12 ">
<div class="input-field">
<input placeholder="Your Id" id="employeeId" type="number" class="validate" required pattern ="^d{10}$" >
<label class="active" for="id">Your Id</label>
</div>
<div class="input-field">
<input placeholder="Your name" id="fullname" type="text" class="validate" disabled >
<label class="active" for="name">Full Name</label>
</div>
<div class="file-field input-field">
<div class="btn">
<span>File</span>
<input type="file" name="myFile">
</div>
<div class="file-path-wrapper">
<input class="file-path validate" type="text">
</div>
</div>
<button id="btn" class="btn waves-effect waves-light" type="submit"
name="action" > Submit
<i class="material-icons right">send</i>
</button>
</div>
</div>
<div class="row">
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<?!=include('js');?>
</body>
</html>
JS-код
document.getElementById('btn').addEventListener('click',
function(e){
google.script.run.withSuccessHandler(onSuccess).uploadFiles(this.parentNode)
})
function onSuccess(data){
document.getElementById('msg').innerHTML = "Thanks for Uploading";
}
Эта функция в .gs
function uploadFiles(data)
{
var file = data.myFile;
var folder = DriveApp.getFoldersByName(collected-Pdf);
Logger.log(folder);
var createFile = folder.createFile(file);
}
Ответ №1:
В строке google.script.run.withSuccessHandler(onSuccess).uploadFiles(this.parentNode)
я не думаю, что вы можете просто отправить весь html-узел на сервер, он, вероятно, пытался проанализировать его как json или что-то в этом роде и потерпел неудачу, самое большее, что вы можете сделать, это отправить сам файл
google.script.run.withSuccessHandler(onSuccess).uploadFiles(document.getElementsByClassName("myFile").files[0])
Плюс родительский узел кнопки в любом случае не является элементом ввода, но вы пытаетесь получить доступ к его .myFile
элементу, но я не думаю, что имена классов добавляются на сервер подобным образом, но даже если бы они были, это был бы доступ только к самому элементу ввода, а не к его .files
свойству
Комментарии:
1. Да, Google apps script не имеет никакого представления о том, что DOM или веб-API являются серверными, поэтому отправка чего-либо, что было бы недопустимо в обычной среде JavaScript, завершится неудачей…
2. bluejayke , когда я использовал getElementsByClassName(«Мой файл»). files [0] я получил эту ошибку Uncaught TypeError: не удается прочитать свойство ‘0’ undefined в HTMLButtonElement.<анонимный> . поэтому я изменил его на getElementById и я получил ошибку в uploadFiles ошибка , не перехваченная в uploadFiles (uploadFunction: 3) . Я проверил консоль Chrome и обнаружил, что ошибка заключается в том, что функция ue (a, b) { b = Error(b); b.name = a; возвращает b
3. почему он не может прочитать свойство myFile . каждый раз, когда я нажимаю на кнопку, я получаю Uncaught в uploadFiles (uploadFunction: 2) строка номер 2 — это var file = data.myFile; . который он должен быть определен в <тип ввода =»file» name =»myFile»>
4. @nassaf похоже, что кнопке также был присвоен тот же класс, что и тегу ввода. В
<input>
поле добавьте идентификатор, затем используйте getElementById(«ИДЕНТИФИКАТОР»). файлы [0] вместо
Ответ №2:
Я нашел ответ после разделения кода и тестирования каждого кода один за другим. Оказалось, что name =»действие и waves-эффект являются причиной остановки выполнения кода. Я не знаю почему, но теперь он работает после удаления их из html.
<button id="btn" class="btn waves-light" type="submit"
" > Submit
<i class="material-icons right">send</i>
</button>