Скрипт приложения Google: загрузите CSV-файл из сервиса html - PullRequest
0 голосов
/ 26 февраля 2020

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

html вызов службы :

function importAnalysis() {
  var html = HtmlService.createHtmlOutputFromFile('Import')
      .setWidth(1524)
      .setHeight(800);
  SpreadsheetApp.getUi()
      .showModalDialog(html, 'Import d\'analyse');
}

html шаблон:

<!DOCTYPE html>
  <html>
    <body>
      <form>
        <input type="file" name="analysisCsv" accept=".csv">
        <input type="button" onclick="google.script.run.processForm(this.parentNode);">
      </form>
    </body>
  </html>

gs файл (я прокомментировал дополнительный код, чтобы определить источник проблемы):

function processForm(form) {
  let fileBlob=form.analysisCsv;
//  sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Table_Analysis");
//  let lastRow = sheet.getLastRow();
//  let values = []
//  let rows = fileBlob.contents.split('\n');
//  for(let r=0; r<rows.length; ++r){
//    values.push( rows[r].split(';') );
//  }
//  for (var i = 0; i < values.length; i++) {
//    sheet.getRange(lastRow+i+1, 1, 1, values[i].length).setValues(new Array(values[i]));
//  }  
}

Проблема я получаю сообщение об ошибке 400 в функции processForm: «Не удалось загрузить ресурс: сервер ответил со статусом 400 ()»

Знаете ли вы, что не так с моим кодом, или другой способ загрузки контента CSV в мой лист? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Итак, чтобы подвести итог, мне пришлось принудительно установить время выполнения Legacy: выберите «Выполнить»> «Отключить новое время выполнения скрипта Apps» на основе V8. Затем отредактируйте весь синтаксис V8: в основном замените «let» на «var». Теперь все работает, спасибо всем.

См. https://developers.google.com/apps-script/guides/v8-runtime/migration https://developers.google.com/apps-script/guides/v8-runtime#enabling_the_v8_runtime

0 голосов
/ 26 февраля 2020

Вы не можете предоставить doPost () с параметром. Из документации:

When a user visits an app or a program sends the app an HTTP GET request, Apps Script runs the function doGet(e). When a program sends the app an HTTP POST request, Apps Script runs doPost(e) instead. In both cases, the e argument represents an event parameter that can contain information about any request parameters. The structure of the event object is shown in the table below: И вот ссылка на это

Как я уже говорил в моем комментарии выше, простой способ передачи формы на сервер:

google.script.run.proccessForm(this.parentNode)

И это объясняется здесь и частично здесь

Ну, я наконец-то запустил ваш код Я уверен, что он не работает в V8.

Итак, я перешел на старую версию, и вот код, который я использовал:

GS:

function runThree() {
  var html = HtmlService.createHtmlOutputFromFile('ah3').setWidth(400).setHeight(400);
  SpreadsheetApp.getUi().showModelessDialog(html, 'Title');
}

function processForm(form) {
  Logger.log(JSON.stringify(form));
  var fileBlob=form.analysisCsv;
  var folder=DriveApp.getFolderById(getGlobal('TestFolderId'));
  var file=folder.createFile(fileBlob);
  var csv=Utilities.parseCsv(file.getBlob().getDataAsString());
  var sh=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet10");
  var rg=sh.getRange(sh.getLastRow()+1,1,csv.length,csv[0].length).setValues(csv);
  return "I've got it";
}

HTML:

<!DOCTYPE html>
  <html>
    <head>
    <base target="_top">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    </head>
    <body>
      <form>
        <input type="file" name="analysisCsv" accept=".csv">
        <input type="button" value="Save" onclick="intermediate(this.parentNode);">
        <div id="msg"></div>
      </form>
      <script>
        function intermediate(obj) {
          google.script.run
          .withSuccessHandler(function(msg){$('#msg').html(msg);google.script.host.close();})
          .processForm(obj);
        }
        console.log('My Code');
      </script>
    </body>
  </html>

Я только что создал CSV-файл и загрузил его в папку, а затем использовал Utilites.parseCsv () , который преобразует его в двумерный массив, который можно вставить в электронную таблицу с помощью setValues ​​();

...