Скрипт Google Apps удаляет символы из постданных
При публикации данных в моем сценарии веб-приложения Google для электронных таблиц Google удаляет норвежские символы из данных постданных. e.postData.contents правильно, но e.parameters неверно. Смотрите пример кода ниже. При нажатии кнопки отправки вы увидите, что e.parameters и e.postData.contents, возвращаемые сценарием Google, различаются.
Чтобы воспроизвести проблему с помощью собственного веб-приложения Google для работы с электронными таблицами, выполните следующие действия.
- Сделайте копию моей электронной таблицы Google
- В электронной таблице выберите Инструменты-> Редактор сценариев.
- В редакторе сценариев выберите "Опубликовать" -> "Развернуть как веб-приложение".
- В открывшемся диалоговом окне установите "У кого есть доступ к приложению" на "Любой, даже анонимный". Наконец, нажмите "Развернуть".
- Теперь вам говорят, что вам нужно дать разрешения для сценария. Нажмите "Просмотр разрешений". Сообщение говорит вам, что вы должны разрешить запуск этого скрипта, только если вы доверяете разработчику. Нажмите "Дополнительно" и нажмите на ссылку в багажнике. Нажмите разрешить.
- В появившемся диалоговом окне скопируйте адрес "URL текущего веб-приложения".
- В примере кода замените переменную 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>