invalidArgumentError: когда я загружаю файл с помощью Google app script

#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>