Как добавить загрузку файла в электронную таблицу в качестве опции пользовательского меню?

#google-apps-script #google-sheets

#google-apps-script #google-sheets

Вопрос:

Я хочу создать электронную таблицу CMS — то есть для чтения / записи данных из firebase и наоборот. Я достиг точки, когда мне нужно загружать файлы непосредственно из электронной таблицы, а не с любой другой страницы.

Я добавил пользовательское меню с HtmlService для вывода шаблона, в котором пользователь может щелкнуть и загрузить файл, и этот файл должен обрабатываться в Google script, но проблема в том, что я получаю только поддельный путь к файлу «c:/fakepath/avatar.png » и не большой двоичный объект.

мои файлы в Google script:

upload.html

 <!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  </head>
  <body>
    <div>
        <div id="progress" ></div>

        <input type="file" name="upload" id="file">
        <input type="submit" value="Submit" class="action" onclick="form_data()" >
        <input type="button" value="Close" onclick="google.script.host.close()" />
    </div>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
    </script>
    <script>
      function form_data(){
        var values = [{
          "file":$("#upload").val(),
        }];

        google.script.run.withSuccessHandler(closeIt).upload(values);
      };

      function closeIt(){
        google.script.host.close()
      };
    </script>
  </body>
</html>
  

test.gs

 function upload(values){
  //Display the values submitted from the dialog box in the Logger. 
  Logger.log(values); // here I'm getting file = c/fakepath/avatar.png while I 
       //need the file to send it as a post request or save it in google drive
};
  

Я считаю, что мне следует использовать FileReader, но я попытался и потерпел неудачу:

       var file, 
        reader = new FileReader();

// Upload the file to Google Drive
  reader.onloadend = function(e) {
    google.script.run
      .upload(
         e.target.result, file.name
      );
  };
      function form_data(){
    reader.readAsDataURL(file);
}
  

загрузка файла пользовательского меню

Ответ №1:

  • Вы хотите загрузить файл с помощью диалогового окна в документах Google на Google Диск.

Если я правильно понимаю, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Модифицированный скрипт:

Скрипт Google Apps:

 function upload(obj) {
  var file = DriveApp.createFile(obj.upload);
  return {
    fileId: file.getId(),
    mimeType: file.getMimeType(),
    fileName: file.getName(),
  };
}
  

HTML:

Пожалуйста, замените <body>...</body> следующим образом. В этой модификации jquery не используется.

 <body>
  <form> <!-- Modified -->
    <div id="progress" ></div>
    <input type="file" name="upload" id="file">
    <input type="button" value="Submit" class="action" onclick="form_data(this.parentNode)" >
    <input type="button" value="Close" onclick="google.script.host.close()" />
  </form>
  <script>
    function form_data(obj){ // Modified
      google.script.run.withSuccessHandler(closeIt).upload(obj);
    };
    function closeIt(e){ // Modified
      console.log(e);
      google.script.host.close();
    };
  </script>
</body>
  

Примечание:

  • Когда вы загрузили файл, возвращаются идентификатор файла, его тип и имя файла созданного файла. Вы можете увидеть их на консоли.
  • В этом методе, поскольку blob используется, максимальный размер файла составляет 50 МБ. Пожалуйста, будьте осторожны с этим.

Если я неправильно понял ваш вопрос, и это был не тот результат, который вы хотите, я приношу извинения.

Комментарии:

1. @ilya Спасибо за ответ. Я рад, что ваша проблема была решена.