Google Apps Script - GMail Inline Image

最近剛好有需求要做Mail Parser,主要是需要把Mail附件拿來做些處理,Google Apps Script其實在這部份已經做的很棒,詳細可以查詢GmailApp,其中Inbox對於Gmail來說就像是個郵件盒,每個郵件盒中有很多的郵件(GmailMessage),每封郵件內可能還會夾帶著附件(GmailAttachment),相同一系列的郵件(就是一直Re: Fwd:)這些郵件會變為一個郵件串(GmailThread),你可以針對每一個郵件串(GmailThread)貼上標籤(GmailLabel)來分類,這就是在Google Apps Script中所分的幾個大分類。

  • GmailApp:Gmail
  • Inbox:Gmail 的Inbox
  • GmailThread:郵件串
  • GmailLabel:郵件串的標籤
  • GmailMessage:郵件
  • GmailAttachment:郵件附件

對於基本的GMail該有的功能幾乎是都有了,但對於Inline Image似乎沒有辦法取得,既不在Mail body也不在attachment中,但這圖片確實可以出現在Gmail中,從Mail Body只會取得一個連結,但這連結必須要Google login session才可以拿到,在Google apple script沒辦法直接用curl來login,所以開始了找尋新的一條路...最後發現在RawContent中其實有夾帶著Inline Image,是用base64 encode的binary,重點就是要把這些Parse出來decode轉成blob,就可以自由的使用,但在parse過程中遇到很多問題,現在的Mail server種類很多,Mail client更是多...每一個上傳過來的多少都有點落差,在這邊判斷這東西實在很麻煩,所以目前採用了一種方式解決,把所有收到的Email 再轉寄到另一個Gmail,這樣就可以保證收到的Mail全部都是Google 格式,也因此parse只要寫一種(GMail)即可。

如果有興趣使用可以直接Import,project key「MexeYVcutPEfH4PE_lTdUTQ1vcfzwSFZI」

使用方式 sample
//只要使用下面這行就會回傳inline image的Array(blob array)
Mail.getGmailInlineAttachments(gmailMessage)


相關連結
source code - https://script.google.com/d/1S9W3czqvmbE20rXUMrZogPz3ij54CudfU7ugIVAKmTU0-U9Nw2k4xNFH/edit
Google Apps Script Gmail - https://developers.google.com/apps-script/service_gmail

Google Apps Script - SpreadSheet Library

前一篇有講過Google Apps Script - SpreadSheet,在使用Google 提供的Library還是感覺有些常用的東西沒有,所以就自己寫了個Library把幾個常用的整理起來。加入Library的使用方式如下:

Project Key「MDu1zmJTs8tZwFGuAKerzvA1vcfzwSFZI」

Step1. Resource >> Manage libraries



Step2. 輸入Project Key「MDu1zmJTs8tZwFGuAKerzvA1vcfzwSFZI」
成功Input後可以選擇所需要的版本、觀看文件,以及此Library在自己的Project中代表的變數名稱



Step3. Save

完成後就可以直接來使用,開始呼叫任何一個function前記得要先呼叫「initWithSpreadsheetId」,先把Id設定好後所有的function才可以使用,Library列表如下
  • initWithSpreadsheetId:設定要存取哪一個SpreadSheet
  • getSheets:取得SpreadSheet內所有的Sheet
  • getSheet:取得SpreadSheet內取得指定的的Sheet
  • getColumn:取得Sheet內一整欄的資料
  • getColumnIndex:取得Sheet內第一欄的文字位置
  • getRow:取得Sheet內一整行的資料
  • getAllRows:取得Sheet內所有的資料

Project Key「MDu1zmJTs8tZwFGuAKerzvA1vcfzwSFZI」

相關連結
Google Apps Script - https://developers.google.com/apps-script/
Google Apps Script SpreadSheet - https://developers.google.com/apps-script/class_spreadsheetapp

terminal new alias name

自定義Terminal的內容,可使用以下方式

新增一個Alias
alias YOUR_NEW_ALIASNAME='YOUR_COMMAND'

移除alias
unalias YOUR_NEW_ALIASNAME


Google Apps Script - Spreadsheets

Google Doc是個相當棒的協作服務,尤其最吸引我的一點就是不需要再擔心一份檔案寄來寄去,最後只能靠檔名加註是幾月記號的版本,而且不需要多浪費不必要的重複檔案,配合上Hangouts還可以同時視訊、語音,確實有效解決了需要面對面開會的問題,單然還是有些不能取代的部份,至少可以減少不必要的資源浪費。

Spreadsheets就像是Excel,函數的數量並沒有像Excel完整,但足以應付基本應用。不論是Excel, Numbers, Spreadsheets還是會有無法完成些特定的需求,如同資料庫可以依照想要的需求下指令,但這問題有解了,Google 有提供給Spreadsheets API,但需要client認證,若不想寫client認證,也有另外的選擇「Google Apps Script」。

Google Apps Script,就以官方的簡單一段話「Google Apps Script 是個Javascript的雲端腳本語言,提供了Google自家產品、第三方服務簡單的來自動執行任務」並提供了四大要點(註一):
  • 自動化的完成重複流程
  • 把Google產品與第三方服務連結
  • 建立自己的函數(也就是Spreadsheets自定函數,如同Excel自定函數)
  • 建立豐富的圖形化介面、菜單

其中第二點我認為是這服務最吸引我的點,在API中有提供HTTP Response以及UiApp。
簡單來說可以把Spreadsheets當做MySQL,Google Drive當做硬碟,HTTP Response用來跟其他3-party Service用web service溝通,UiApp可以當做Web Server來更新資訊,簡直就是把過去常聽到的LAMP直接轉換為雲端的版本,直接交由Google來作系統(噫!?Chrome OS ?)

使用方式
Step1. 隨意打開一個Spreadsheets,從MENU中找出Tools


其中有兩個比較重要的如下:
  • Script gallery...
  • Script manager...

Script gallery

可藉由上方直接搜尋,找到喜歡的後就直接點下"install"


按下install後會跳出一個請求,要求權限,確認後就完成安裝



Script manager

Script manager可以幫你確認目前文件中所有使用上的Script,在這邊可以進行所有的Script新增、編輯,或者執行其中一個function,列表中右邊的script就是script的project name,而function就是project內可執行的function



如果不想直接修改從Script Gallery找來的Script,也可透過New來新增自己的project & function


其中有幾個內定的function
  • onInstall:建立文件時執行
  • onOpen:開啟文件時執行
  • onEdit:編輯文件時執行(編輯完每一個Cell)
此畫面也為Script的開發、Debug頁面(下一篇再詳細介紹此開發方式)


結論

  • 優點
    • 有寫過Javascript的人應搭配著官方文件就可以快速上手
    • 可以同時結合Google服務(Calendar, Gmail, Google Apps, ...)做出有趣的應用
    • 提供了oauth的function方便第三方的帳號認證
    • 強大的HTTP Response以及UiApp,與其他服務串接不成問題
  • 缺點
    • 目前的開發、Debug環境還是沒很友善
    • 官方文件在很多地方有點怪,例如很容易查不到些關鍵的function、在需要搭配做clientLogin時找不到對應的文件(例如call哪個service name,或者應該說文件版本太多XD)
    • 目前文件僅有英文版
    • 與3-party連接時效能上不是很優(登入 -> 塞一筆資訊到表格中,這兩個動作大約需要3~5秒)
    • 表格容量有限


註一:此為本人簡單的翻譯,詳細請參照:https://developers.google.com/apps-script/

相關連結
Google Apps Script - https://developers.google.com/apps-script/

iOS Mobile AD & AdMob SDK

相信Banner廣告在已經是無所不在的出現於網站中,也因為廣告的投遞不夠精準、太醜、看不順眼等因素產生了瀏覽器的plugin「AdBlock」,但是iOS上就沒有這種plugin(Android:AdBlock Plus),所以該如何塞入適當的廣告增加CTR(Click-through rate),CPM(cost per 1000 impressions)就是個相當直接關係廣告收入的重點,畢竟推撥廣告的不是自己。

先從幾點來說明廣告的生態、呈現方式
  • 行動廣告環境生態
  • 行動廣告平台提供商
  • 行動廣告呈現方式
  • AdMob SDK

行動廣告環境生態
  • 廣告主/代理商
    • 透過平台(下段說明)投遞廣告
  • 開發者
    • 開發APP/ Mobile web 插入廣告
    • 點擊廣告後的活動網頁/ mobile web
  • 消費者
    • 接受行動廣告平台推撥來的廣告
    • 點廣告給平台/開發者賺錢


行動廣告平台提供
目前最熱門就是AdMob,而admob背後推送的平台就是AdWhirl目前AdWhirl是open source,所以有興趣的人也可以自行來架設廣告平台,目前台灣幾個較大的行動廣告平台(Vpon, KuAd)也都是使用AdWhirl為基礎。

除了AdMob外還有幾個較大的平台如InMobi、iAD、......等的平台,其中較為特別的是iAD,他不只扮演了廣告平台的角色,還提供了iAd Producer讓開發者/廣告主快速的製作出活動網頁的工具。


行動廣告呈現方式
  • Banner
    • Phone
      • 320*50
      • 300x250
      • 468x60
      • 728x90
      • 320*50
    • Pad
      • 320*50
      • 360x50
      • 480x32
      • 533x32, range of sizes from 480x32 to 682x32
      • 768x90
      • 1024x90
      • 800x90
      • 1280x90
      • 600x90
      • 1024x50
  • 全螢幕
    • 影片
    • 網頁
    • 地圖
  • 行動平台SDK
    • 陀螺儀
    • 電子羅盤
    • 加速度感應器
    • 定位服務
    • 相機
    • 震動
    • 加速度感應器
    • 3G/Wifi 網路
    • 多點觸碰/手勢操作
    • 播放聲音/影片
    • 藍牙
    • 地圖

其中可以控制行動平台SDK為比較厲害的作法,結合幾個不同的感應器可組成各種不同的動作完成廣告內容,例如相機+電子羅盤+定位服務可組成常見的LBS AR,地圖+定位服務+網路即可組成如Groupon Now這種有趣的活動。


AdMob SDK
這邊簡單介紹AdMob SDK使用方式,基本上大多在Google 官方已經有詳細介紹,SDK也是隨時都可以下載,唯獨讓我不了解的就是官方的教學當中居然少了兩個Framework,以致於按照官方教學Build仍然會出錯,兩個Framework分別為:
  • AudioToolBox.framework
  • StoreKit.framework

這兩個Framework都可以在iOS內建的Framework找到,加入後Build就不會出問題。


相關連結
AdMob - http://www.google.com/ads/admob/
AdWhirl - https://www.adwhirl.com/
Vpon - http://www.vpon.com/zh-tw/index.html
KuAD - http://www.kusogi.com/
InMobi - http://www.inmobi.com/
iAD - http://advertising.apple.com/
iAD Producer - https://developer.apple.com/iad/iadproducer/