Вставка ссылки изображения, которое было добавлено на Google Drive, в лист Google - PullRequest
1 голос
/ 19 июня 2019

Это вторая часть проблемы, которая была решена здесь: Вставьте ссылку на изображение с Google Drive в Google Sheets после загрузки изображения через веб-приложение

Я занимаюсь разработкой веб-приложения, в котором пользователь может загрузить изображение, нажав кнопку. Это действие загрузит изображения в определенный каталог на моем диске Google с уникальной папкой и именем.

Теперь я пытаюсь скопировать и вставить ссылку на гугл-диск с изображением в любое время, когда оно было загружено.

С помощью @Tanaike мне удалось получить ссылку URL-адреса с диска Google на листе Google, когда я предварительно назначил часть имени папки (fn) и заголовка изображения (i) в пределах Функция getFileUrl (fn, i) в «Code.gs». Но я получаю это "TypeError: Невозможно вызвать метод" getFilesByName "из неопределенного." вывод всякий раз, когда я пытаюсь передать пользовательский ввод "fn" и "i".


page.html - Это внешний интерфейс, куда пользователь загружает картинку

  <html>
  <head> 
   <body>
   <form action="#" method="post" enctype="multipart/form-data">
   <div class="row">
     <div class="file-field input-field">
        <div class="waves-effect waves-light btn-small">
          <i class="material-icons right">insert_photo</i>
          <span>Import Picture</span>
          <input id="files" type="file" name="image">
        </div>

        <div class="file-path-wrapper">
            <input disabled selected type="text" class="file-path 
             validate" placeholder="Choose an image">
        </div>
     </div>
  </div>
  </form>

 <?!= include("page-js"); ?>

</div> <!-- CLOSE CONTAINER-->


 </body>
</html>

Это часть javascript для помещения соответствующей информации в массив, который позже будет использоваться для добавления строки в лист google

страница-js.html

     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
     <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>    
     <script src="https://gumroad.com/js/gumroad.js"></script>

     document.getElementById("files").addEventListener("loadend",doStuff1);
      
   document.getElementById("addAnother").addEventListener("click",doStuff1);
     
     <script>
     
     function doStuff1(){
        
           num.picNum2=i;
           var personName=document.getElementById("fn").value;
           google.script.run.withSuccessHandler(doStuff2).getFileUrl("fn","i"); // Modified by Tanaike
   
            
           var userInfo ={};
           userInfo.firstName= document.getElementById("fn").value;
           userInfo.number=i;
          userInfo.fileUrl=fileId00;        
          num.picNum=i;
           i++;
     google.script.run.userClicked(userInfo);
       
        }
        
          // Added by Tanaike
          function doStuff2(fileId00) {
            var userInfo = {};
            userInfo.firstName = document.getElementById("fn").value;
            userInfo.number = i;
            userInfo.fileUrl = "https://docs.google.com/document/d/"+fileId00 +"/";
            i++;
            google.script.run.userClicked(userInfo);
          }
</script>

Это часть javascript для загрузки файла изображения на диск Google

(все еще часть page-js.html)

var file, 
  reader = new FileReader();
  var today = new Date();
  var date = today.getFullYear()+'-'+(today.getMonth()+1)+'- '+today.getDate();

  reader.onloadend = function(e) {
    if (e.target.error != null) {
      showError("File " + file.name + " could not be read.");
      return;
    } else {
      google.script.run
        .withSuccessHandler(showSuccess)
   .uploadFileToGoogleDrive(e.target.result,num.picNum,date,$('input#fn')
   .val(),$('input#date').val());

    }
  };

   function showSuccess(e) {
    if (e === "OK") { 
      $('#forminner').hide();
      $('#success').show();
    } else {
      showError(e);
    }
  }


     function submitForm() {


    var files = $('#files')[0].files;

    if (files.length === 0) {
      showError("Please select a image to upload");
      return;
    }

    file = files[0];

    if (file.size > 1024 * 1024 * 5) {
      showError("The file size should be < 5 MB.");
      return;
    }

    showMessage("Uploading file..");

    reader.readAsDataURL(file);


  }

        function showError(e) {
    $('#progress').addClass('red-text').html(e);
  }

  function showMessage(e) {
    $('#progress').removeClass('red-text').html(e);
  }

 </script>

Эта часть захватывает массив "userInfo" и добавляет контент в строку на указанном листе Google. В любое время я нажимаю на кнопку в передней части, она создает новую строку. Именно здесь, если я вручную установлю значения fn и i в функции getFileUrl и получу соответствующее изображение и папку в указанном каталоге, я получу действительную ссылку на своем листе Google. Однако, если я оставлю аргумент в качестве переменных, введенных пользователем в веб-приложении, я получу вышеупомянутую ошибку в моей ссылке на листе.

Code.gs

//google sheet web script

    var url="https://docs.google.com/spreadsheets/d/XXXXX";

   function getFileUrl(fn,i){

  try{
      var today0 = new Date();
       var date0 = today0.getFullYear()+'-'+(today0.getMonth()+1)+'-' 
       +today0.getDate();

      var dropbox0 = "OE Audit Pictures";
      var folder0,folders0 = DriveApp.getFoldersByName(dropbox0);

     while (folders0.hasNext())
       var folder0=folders0.next();

      var dropbox20=[date0,fn].join(" ");


      var folder20,folders20=folder0.getFoldersByName(dropbox20);
      while (folders20.hasNext())
         var folder20=folders20.next();


         var file0, files0= folder20.getFilesByName(i);
      while (files0.hasNext())
        var file0=files0.next();


        var fileId0=file0.getUrl();


       return fileId0;
          }  catch(f){
  return f.toString();
        }
    }


  function userClicked(userInfo){

     var ss= SpreadsheetApp.openByUrl(url);
     var ws=ss.getSheetByName("Data");
      ws.appendRow([userInfo.number,new Date(), 
         userInfo.firstName,userInfo.fileUrl]);

      }

   function include(filename){
      return HtmlService.createHtmlOutputFromFile(filename).getContent();  
    }


  function uploadFileToGoogleDrive(data, file, fn, date) {

    try {

    var dropbox = "OE Audit Pictures";
    var folder, folders = DriveApp.getFoldersByName(dropbox);

    if (folders.hasNext()) {
      folder = folders.next();
      } else {
      folder = DriveApp.createFolder(dropbox);
    }


   var contentType = data.substring(5,data.indexOf(';')),
     bytes = 
       Utilities.base64Decode(data.substr(data.indexOf('base64,')+7)),

       blob=Utilities.newBlob(bytes, contentType, file)

       var dropbox2=[fn,date].join(" ");
       var folder2, folders2=folder.getFoldersByName(dropbox2)

       if (folders2.hasNext()){
           folder2=folders2.next().createFile(blob);
       } else {
          file = folder.createFolder([fn,date].join(" ")).createFile(blob);
        }
       return "OK";

       } catch (f) {
      return f.toString();
       }    
     }

1 Ответ

1 голос
/ 21 июня 2019

Как прокомментировали @Jescanellas и @Tanaike, лучшим подходом будет исправить ваш код, редактируя функцию doStuff2 в page-js.html следующим образом:

function doStuff2(fileId00) {
            var userInfo = {};
            userInfo.firstName = document.getElementById("fn").value;
            userInfo.number = i;
            userInfo.fileUrl = "https://docs.google.com/document/d/"+fileId00 +"/";
            i++;
            google.script.run.userClicked(userInfo);
          }

Об ошибке, которую вы получаете, выВы не используете скобки в whiles, это вызывает ошибки, потому что занимает только первую строку после того, как время внутри цикла. Code.gs :

while (folders0.hasNext()) {
     var folder0=folders0.next();

     var dropbox20=[date0,fn].join(" ");


     var folder20,folders20=folder0.getFoldersByName(dropbox20);
     while (folders20.hasNext()) {
         var folder20=folders20.next();


         var file0, files0= folder20.getFilesByName(i);
        while (files0.hasNext()) {
        var file0=files0.next();


        var fileId0=file0.getUrl();


       return fileId0;
       }
   }
}

Что касается вашего вопроса об идентификаторе файла, вы можете легко получить его после создания файла, поскольку он вернет вам объект File, из которого вы можетеполучить идентификатор с помощью метода getId [1]:

file = folder.createFolder([fn,date].join(" ")).createFile(blob);
fileId = file.getId();

[1] https://developers.google.com/apps-script/reference/drive/file

...