(資訊過時已廢棄)Google App Script踩雷

(本篇資訊過時已廢棄)


初用Google app script可以參考這篇
https://www.oxxostudio.tw/articles/201805/backend-apps-script.html

雷點1. 編輯器執行後不會跑輸出給你看

按下編輯器內的"執行",並不會接著跑log或執行結果給你看...

雷點2. 看執行結果的LOG名詞也太多種


我結論就是看log就是找stackdriver
  1. 如果只是要看編輯器跑的log,就選"紀錄 (Ctrl+Enter)"
  2. 如果你要看其他的log,就選"執行項目"。(也是跳到stackdriver)

雷點3. 看log(Stackdriver)要注意執行身份/條件

Stackdriver有區分執行者的,預設從編輯器跳過去都是預設"執行身份"為"自己"
你如果用其他工具測試,如curl/wget/API tester,就需要把左上角的"執行身份"改成"所有人"


雷點3.1. 直接從開發console要看你的WebApp的LOG的路徑很長

左方選單:"我的專案">選{你的專案名稱}>出現圖表後,點右邊的"專案詳細資料"的"...">執行項目

左方選單:"我的執行項目",選擇執行,也不會列出從python或一些工具發出的request。

雷點4. 不同工具發出的request不見得全部都可以在stackdriver中展開內容

我使用python的request就是只會出現紀錄,但是無法展開內容,明明script都沒改阿!

(我個人覺得這應該是stackdrive的bug)

一個python的簡單測試程式, 請取代紅色部份文字
#!/usr/bin/python
import requests
in_url='https://script.google.com/macros/s/......'
obj = {
"from": "python",
"data": "payload",
};
resp = requests.post(in_url, data=obj, allow_redirects=True)

雷點5. 編輯器debugger沒辦法給定程式參數

我目前還找不到給程式參數的方法,建議在程式裏面自己寫,例如下面這樣:
var testReq = { 
  parameter: { },
  postData: { },
  queryString: '',
  contextPath: '',
  parameters: { },
  contentLength: 0
}

function doGet(req) {
  console.log('get');
  return handleResponse(req || testReq);
}

function doPost(req){
  console.log('post');
  return handleResponse(req || testReq);
}

function handleResponse(req) {
  console.log('req:', req);
}

雷點5. 手邊的工具必須支援https和http 302重導向

真心希望debugger內可以讓我塞sample就好,費心找工具也滿累的

雷點6. 雖然都是POST, 但是POST form跟POST json結果不一樣

這個應該也不算是雷點,但是它確實是不一樣...

我用測試工具POST一個JSON

在log中得到



而POST一個FORM
在log中得到



一個簡單的GS測試程式
var testGet = {
parameters:{},
contextPath:"",
contentLength:-1,
queryString:"",
parameter:{}
};
function doGet(req) {
Logger.log('get');
console.log('get');
return handleResponse(req || testGet);
}
var testPost = {
parameter:{ },
//postData:{ },
queryString:"",
contextPath:"",
parameters:{ },
contentLength:0
};
function doPost(req) {
Logger.log('post');
console.log('post');
return handleResponse(req || testPost);
}
function handleResponse(req) {
Logger.log('req:', req);
console.log('req:', req);
if (req.parameter['format'] && "json"===req.parameter['format']) {
return ContentService
.createTextOutput(JSON.stringify({"result":"ok","req":JSON.stringify(req)}))
.setMimeType(ContentService.MimeType.JSON);
}
return ContentService.createTextOutput('result ok, req:' + JSON.stringify(req));
}
/*
your_app_url=https://script.google.com/macros/s/....
GET your_app_url
result ok, req:{"parameter":{},"parameters":{},"contextPath":"","contentLength":-1,"queryString":""}
GET your_app_url + '/json'
>got pathInfo
result ok, req:{"pathInfo":"json","parameter":{},"queryString":"","parameters":{},"contextPath":"","contentLength":-1}
GET your_app_url + '?json'
>got parameter,parameters,queryString
result ok, req:{"parameter":{"json":""},"parameters":{"json":[""]},"contextPath":"","contentLength":-1,"queryString":"json"}
GET your_app_url + '?format=json'
{"result":"ok","req":"{\"queryString\":\"format=json\",\"parameter\":{\"format\":\"json\"},\"parameters\":{\"format\":[\"json\"]},\"contextPath\":\"\",\"contentLength\":-1}"}
---
#!/usr/bin/python
# TEST POST REQUEST FOR GOOGLE APP SCRIPT
import requests
your_app_url='https://script.google.com/macros/s/......'
obj = {
"from": "python",
"data": "payload",
};
resp = requests.post(your_app_url, data=obj, allow_redirects=True)
obj = {} POST your_app_url
result ok, req:{"parameter":{},"parameters":{},"contextPath":"","contentLength":0,"queryString":""}
POST your_app_url
>got parameter,postData,parameters
'result ok, req:{"parameter":{"from":"python","data":"payload"},"queryString":"","postData":{"contents":"data=payload&from=python","length":24,"name":"postData","type":"application/x-www-form-urlencoded"},"contextPath":"","parameters":{"from":["python"],"data":["payload"]},"contentLength":24}'
POST your_app_url + '?format=json'
>got parameter,postData,parameters
'{"result":"ok","req":"{\\"queryString\\":\\"format=json\\",\\"parameter\\":{\\"format\\":\\"json\\"},\\"parameters\\":{\\"format\\":[\\"json\\"]},\\"contextPath\\":\\"\\",\\"contentLength\\":0}"}'
*/
view raw gistfile1.txt hosted with ❤ by GitHub


留言