Перемещение скрипта приложений Google в файл v8 перестало работать с боковой панели - PullRequest
0 голосов
/ 18 марта 2020

У меня работает скрипт, который работает как задумано. Но перемещение скрипта в v8 делает скрипт не работающим. И я не могу найти решение.

Я очистил скрипт и протестировал его на старом движке и все еще работает, но в v8 все еще не работает.

Это боковая панель в электронной таблице, где можно загрузить один файл на мой диск Google.

Здесь основные c в файле Html

<body>
<h1>File Uploader</h1>
<form>
    <input type="file" name="myFile" id="file">
    <br>
    <input class="blue" type="button" id="submitBtn" value="Upload File" onclick="uploadthis(this.parentNode)">

</form>

<input type="button" value="Close" onclick="google.script.host.close()" />

<script>

function uploadthis(fileForm){

google.script.run
.uploadFiles(fileForm)
}



</script>

</body>

А вот упрощенный гс

function uploadContract() {
  var html = HtmlService.createHtmlOutputFromFile('ContractUpload').setTitle('Kontrakt upload').setWidth(300);
SpreadsheetApp.getUi().showSidebar(html);
}

function uploadFiles(data){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sStamdata = ss.getSheetByName('Stamdata_New');
var contractFolderId = sStamdata.getRange('D60').getValue(); 
var idag = Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd");
var title = sStamdata.getRange('D52').getValue();

var file = data.myFile;
var folder = DriveApp.getFolderById(contractFolderId);
var createFile = folder.createFile(file);
createFile.setName(idag+" - KONTRAKT - "+title);

}

1 Ответ

2 голосов
/ 19 марта 2020

Как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Проблема и обходной путь:

Я мог бы подтвердить примерно такую ​​же ситуацию с вашей проблемой. В этом случае, я думаю, что когда V8 включен, объект формы может быть не в состоянии проанализировать, когда объект отправляется на сторону скрипта Google Apps с помощью google.script.run. Хотя я думаю, что это может быть изменено в будущем обновлении, в качестве текущего обходного пути я хотел бы предложить отправить загруженный файл на сторону GAS в виде байтового массива.

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

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

HTML & Javascript side: ContractUpload.html

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

function uploadthis(fileForm){
  const file = fileForm.myFile.files[0];
  const fr = new FileReader();
  fr.onload = function(e) {
    const obj = {
      // filename: file.name,  // In your script, the filename is given at GAS side. So I removed this.
      mimeType: file.type,
      bytes: [...new Int8Array(e.target.result)]
    };
    google.script.run.withSuccessHandler((e) => console.log(e)).uploadFiles(obj);
  };
  fr.readAsArrayBuffer(file);
}

Сторона скрипта Google Apps: Code.gs

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

function uploadFiles(data){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sStamdata = ss.getSheetByName('Stamdata_New');
  var contractFolderId = sStamdata.getRange('D60').getValue(); 
  var idag = Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd");
  var title = sStamdata.getRange('D52').getValue();

  var file = Utilities.newBlob(data.bytes, data.mimeType, idag+" - KONTRAKT - "+title);  // Modified
  var folder = DriveApp.getFolderById(contractFolderId);
  var createFile = folder.createFile(file);
  return createFile.getId();  // Added
}

Примечание:

  • При вышеуказанном изменении, когда файл После загрузки файл преобразуется в байтовый массив и отправляется на сторону GAS. Затем файл создается из байтового массива. И идентификатор файла возвращается. Вы можете увидеть это в консоли.

Ссылки:

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

...