Скрипт Google Apps удаляет символы из постданных

При публикации данных в моем сценарии веб-приложения Google для электронных таблиц Google удаляет норвежские символы из данных постданных. e.postData.contents правильно, но e.parameters неверно. Смотрите пример кода ниже. При нажатии кнопки отправки вы увидите, что e.parameters и e.postData.contents, возвращаемые сценарием Google, различаются.

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

  1. Сделайте копию моей электронной таблицы Google
  2. В электронной таблице выберите Инструменты-> Редактор сценариев.
  3. В редакторе сценариев выберите "Опубликовать" -> "Развернуть как веб-приложение".
  4. В открывшемся диалоговом окне установите "У кого есть доступ к приложению" на "Любой, даже анонимный". Наконец, нажмите "Развернуть".
  5. Теперь вам говорят, что вам нужно дать разрешения для сценария. Нажмите "Просмотр разрешений". Сообщение говорит вам, что вы должны разрешить запуск этого скрипта, только если вы доверяете разработчику. Нажмите "Дополнительно" и нажмите на ссылку в багажнике. Нажмите разрешить.
  6. В появившемся диалоговом окне скопируйте адрес "URL текущего веб-приложения".
  7. В примере кода замените переменную actionscript адресом, который вы скопировали на шаге 6.

var actionScript = "https://script.google.com/macros/s/AKfycbxW1qHugD1K4adTjGAEt1KqbcbAn1LlaCoWx6GtlNdsNO_E-rTO/exec";

$(document).ready(function(){
    var sendButton = $("#send");
    if(sendButton != null)
    {
   sendButton.click(handleSend);
    }
});

function handleSend(event) { 
  var data = $("#name").val();
  console.log(data);
  var postData = "name="+data;
  console.log(postData);


 request = $.ajax({
  url: actionScript,
  type: "post",
  data: postData,

  beforeSend: function () {
   console.log("Loading");
  },

  error: function (jqXHR, textStatus, errorThrown) {
   console.log(jqXHR);
   console.log(textStatus);
   console.log(errorThrown);
  },

  success: function (result) {
   console.log("success");
      var s = "<p>e.parameters=" + result.data + "</p><p>e.postData.contents="+result.postdata+"</p>"
      $("#result").html(s);
      debugger;
  },

  complete: function () {
   console.log('Finished all tasks');
  }
 });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!doctype html>
<html lang="no">
<head>
    <meta charset="utf-8">
</head>

<body>
<input id="name" type="text" value="GÅGHØHRÆR" size="50"/>
<button id="send">Send</button>
<div id="result">

</div>
</body>
</html>

1 ответ

Мое окончательное решение до сих пор:) состоит в том, чтобы просто использовать encodeURIComponent для кодирования данных, отправляемых в скрипт Google:

encodeURIComponent( data )

Со стороны сценария google, параметры e.parameters будут правильно декодироваться, по крайней мере, для норвежских символов.

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

----

Прежде чем я пришел к выводу выше, я прошел через следующее, что я думал, может быть полезным для других:

window.btoa (data) неправильно кодировала норвежские символы "æøå". Я должен был сделать

window.btoa(unescape(encodeURIComponent( data )))

как предложено здесь: https://www.sumitgupta.net/javascript-base64-encode-decode-for-utf-8unicode-string/

https://www.base64decode.org/ и https://www.base64encode.org/ помогли мне понять это как window.btoa(""øå")="5vjl" при вводе enteringøå в https://www.base64encode.org/ с кодировкой UTF-8 дает "w6bDuMOl".

На стороне сценария приложения Google мне нужен был такой код:

var decodedData = Utilities.base64Decode(e.parameter["name"]);var decodedDataAsString = Utilities.newBlob(decodedData).getDataAsString();

var actionScript = "https://script.google.com/macros/s/AKfycbwbYukbEejyL4yNlbW7xdfXPVZkZFJ7StxUIrKC/exec";

$(document).ready(function(){
    var sendButton = $("#send");
    if(sendButton != null)
    {
   sendButton.click(handleSend);
    }
});

function handleSend(event) { 
  var data = $("#name").val();
  var data2 =   encodeURIComponent( data );
  console.log(data2);
  var postData = "name="+data2;
  console.log(postData);

  request = $.ajax({
  url: actionScript,
  type: "post",
  data: postData,

  beforeSend: function () {
   console.log("Loading");
  },

  error: function (jqXHR, textStatus, errorThrown) {
   console.log(jqXHR);
   console.log(textStatus);
   console.log(errorThrown);
  },

  success: function (result) {
   console.log("success");
      var s = "<p>e.parameters['name']=" + result.data + "</p><p>e.postData.contents="+result.postdata+"</p>"
      $("#result").html(s);
  },

  complete: function () {
   console.log('Finished all tasks');
  }
 });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!doctype html>
<html lang="no">
<head>
    <meta charset="utf-8">
</head>

<body>
<input id="name" type="text" value="GÅGHØHRÆR" size="50"/>
<button id="send">Send</button>
<div id="result">

</div>
</body>
</html>

Другие вопросы по тегам