Google应用脚本会从postdata

时间:2018-04-12 12:04:54

标签: google-apps-script postdata

将数据发布到我的Google电子表格网络应用脚本时,Google会从postdata中删除挪威字符。 e.postData.contents是正确的,但e.parameters不正确。请参阅下面的代码示例。按send时,您会看到Google脚本返回的e.parameters和e.postData.contents不同。

使用您自己的Google电子表格网络应用重现问题:

  1. 制作my google spreadsheet
  2. 的副本
  3. 在电子表格中,选择工具 - >脚本编辑器
  4. 在脚本编辑器中,选择“发布” - >“部署为Web应用程序”
  5. 在打开的对话框中,设置"谁有权访问该应用"到任何人,甚至匿名"。最后,按" Deploy"。
  6. 现在告诉您需要授予脚本权限。按"查看权限"。如果您信任开发人员,则会显示一条消息,告知您应该只允许运行此脚本。点击"高级"然后单击bootom上的链接。点击“允许”。
  7. 在显示的新对话框中,复制"当前网络应用网址"的地址。
  8. 在代码示例中,将变量actionscript替换为您在步骤6中复制的地址。
  9. 
    
    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');
    		}
    	});
    }
    &#13;
    <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>
    &#13;
    &#13;
    &#13;

1 个答案:

答案 0 :(得分:0)

我到目前为止的最终解决方案:)是使用encodeURIComponent来编码发布到google脚本的数据数据:

encodeURIComponent( data )

在谷歌脚本方面,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”,而使用UTF-8编码在https://www.base64encode.org/中输入æøå则会显示“w6bDuMOl”

在谷歌应用程序脚本方面,我必须有这个代码:

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>