Код для вставки нескольких фотографий с диска Google во внутренние ячейки в листах Google - PullRequest
1 голос
/ 05 февраля 2020

Мне удалось найти некоторый код и настроить его для загрузки нескольких изображений на диск (благодаря tanaikech), но мне не удалось создать URL общих фотографий и вставить их в электронную таблицу Google ниже, это мой пример кода.gs

    function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

function saveFile(obj) {
  var blob = Utilities.newBlob(Utilities.base64Decode(obj.data), obj.mimeType, obj.fileName);
 var file=DriveApp.createFile(blob);
 var fileId= file.getId()
  return fileId



  file.setSharing(DriveApp.Access.ANYONE_WITH_LINK,DriveApp.Permission.VIEW);


        var fileUrl = "https://drive.google.com/uc?export=view&id="+fileId;
  Logger.log(fileUrl);

 var url="https://docs.google.com/spreadsheets/d/12bhRyuHXzcMP7AS8cHhtkp2Sa6kDObZYRT1FY13appU/edit#gid=0";
 var ss= SpreadsheetApp.openByUrl(url);
 var ws= ss.getSheetByName("DB");


     ws.appendRow([fileUrl]);

     return ContentService.createTextOutput("Success").setMimeType(ContentService.MimeType.JAVASCRIPT);  

}

И мой указатель. html:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.js"></script>

  </head>
  <body>

<input name="file" id="files" type="file" multiple>
<input type='button' value='Upload' onclick='getFiles()'>

   
<script>
function getFiles() {
  const f = document.getElementById('files');
  [...f.files].forEach((file, i) => {
    const fr = new FileReader();
    fr.onload = (e) => {
      const data = e.target.result.split(",");
      const obj = {fileName: f.files[i].name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]};
      google.script.run.withSuccessHandler((id) => {
        console.log(id);
      }).saveFile(obj);
    }
    fr.readAsDataURL(file);
  });
}
</script>

  </body>
</html>

вот ссылка на мою страницу Google https://docs.google.com/spreadsheets/d/12bhRyuHXzcMP7AS8cHhtkp2Sa6kDObZYRT1FY13appU/edit?usp=sharing

Спасибо,

1 Ответ

1 голос
/ 05 февраля 2020
  • Например, когда 2 файла загружаются одной загрузкой, вы хотите поместить 2 URL в одну строку.

Я могу понять, как выше. И я могу подтвердить, что вышеприведенное понимание верно из вашего ответа . В этом случае, как насчет следующей модификации? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки изменения:

  • В вашем скрипте файл загружается с асинхронным процессом. При этом URL-адреса помещаются строка за строкой. Чтобы размещать URL-адреса в одной строке при каждом процессе загрузки, сначала необходимо получить URL-адрес. Затем URL-адреса помещаются в одну строку.

Если это отражено в вашем скрипте, измените его следующим образом.

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

Google Apps Сторона сценария: Code.gs

Пожалуйста, измените функцию saveFile и добавьте новую функцию putUrls следующим образом. Укажите URL-адрес электронной таблицы.

function saveFile(obj) {
  var blob = Utilities.newBlob(Utilities.base64Decode(obj.data), obj.mimeType, obj.fileName);
  var file=DriveApp.createFile(blob);
  var fileId= file.getId()
  file.setSharing(DriveApp.Access.ANYONE_WITH_LINK,DriveApp.Permission.VIEW);
  var fileUrl = "https://drive.google.com/uc?export=view&id="+fileId;
  return fileUrl;
}

function putUrls(urls) {
  Logger.log(urls)
  var url = "https://docs.google.com/spreadsheets/d/###/edit#gid=0";  // <--- Please set this.
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("DB");
  ws.appendRow(urls);
}

HTML и Javascript side: index. html

Пожалуйста, измените Javascript следующим образом.

<script>
function saveFile(f, file, i) {
  return new Promise((resolve, reject) => {
    const fr = new FileReader();
    fr.onload = (e) => {
      const data = e.target.result.split(",");
      const obj = {fileName: f.files[i].name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]};
      google.script.run.withSuccessHandler((url) => resolve(url)).withFailureHandler(e => reject(e)).saveFile(obj);
    };
    fr.readAsDataURL(file);
  });
}

async function getFiles() {
  let urls = [];
  const f = document.getElementById('files');
  for (var i = 0; i < f.files.length; i++) {
    const url = await saveFile(f, f.files[i], i).catch(e => console.log(e));
    urls.push(url);
  }
  google.script.run.putUrls(urls);
}
</script>
  • В этой модификации файлы загружаются с синхронным процессом, а URL-адреса помещаются в массив. Затем массив обрабатывается в putUrls.

Примечание:

  • При изменении сценария веб-приложений, пожалуйста, повторно разверните веб-приложения как новую версию , Таким образом, последний скрипт отражается на веб-приложениях. Пожалуйста, будьте осторожны с этим.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...