昨天我們利用 GAS 讀取了篩選郵件的內容
今天我們要進一步將資料存到 Google Sheet 以供 Line Messaging Api 讀取
篩選郵件的內容其實可以優化到限制只獲取 Netflix 驗證碼相關的信件中的驗證碼
但因為這牽涉到 Netflix 驗證碼信件的格式,所以這邊就不多做示範
接下來的內容一律先用假資料驗證信去完成,信件內容如下:
因為目標是將之前建置的 GAS 專案可以讀取指定的信件內容,並且將驗證碼存到 Google Sheet 中,這可以拆解成以下幾個功能:
首先將 GAS 專案架構修改如下圖,這樣才不會所有程式碼都擠在一起變超長
入口點為 app.gs
先前完成的 readMail.gs 的內容修改如下
function readMail() {
Logger.log('start to readMail');
var firstThread = GmailApp.search('subject:(Validation Code Test)', 0, 1)[0];
var messages = firstThread.getMessages();
var lastMessageIndex = firstThread.getMessageCount() - 1;
if (lastMessageIndex < 0) {
throw Error;
}
var content = messages[lastMessageIndex].getPlainBody();
return content.trim();
}
跟串接 Gmail 服務一樣,要使用 Google Sheet 首先要新增 Google Sheet Api 的服務
一樣可以找到支援文件:
Google Sheet Api 文件
比較特別的是,Google 有一系列的文件教你如何將 sheet 擴充使用,甚至是結合他們提供的其他 GCP 服務
Extending Google Sheets
其中與本次專案比較相關的文件有:
Fundamentals of Apps Script with Google Sheets #2: Spreadsheets, Sheets, and Ranges
題外話,如果想瞭解更多 GAS 的基礎使用跟範例,可以閱讀以下教學系列文章
Codelabs: Apps Script Fundamentals
If you're new to Apps Script, you can learn the basics using our Fundamentals of Apps Script with Google Sheets codelab playlist.
那麼,首先就是要建立一個新的 Google Sheet 讓我們存放資料
有資料庫概念的人,可以把 Google Sheet 想像成 Database,而裡面每張 Sheet 等同於 Table
如此一來就可以規劃我們的存放資料的欄位
注意:畢竟 Google Sheet 不是真的資料庫,也許他可以應付輕量存取或簡單的用途,但不要期望他能做到跟真正的資料庫一樣
建立完的 Google Sheet 如下
接著打開共用,選擇知道連結的人都能編輯
根據教學文件提到,連結中間的那串就是你的 spreadsheet id,並且我們可以使用 openById
去連接到這張表
在 connectToSheet.gs 中新增以下的內容
function connectToSheet() {
Logger.log('start to connectToSheet');
var spreadSheet = SpreadsheetApp.openById('your_spread_sheet_id');
var sheet = spreadSheet.getSheetByName('your_sheet_name');
Logger.log(sheet.getName());
}
按下執行,確認結果是否可以正確讀到該張工作表的 name
p.s. 過程中可能會出現審查權限的要求
接著將 connectToSheet.gs 修改如下,讓 app.gs 執行時可以拿到連接好的 sheet instance
function connectToSheet() {
Logger.log('start to connectToSheet');
var spreadSheet = SpreadsheetApp.openById('your_spread_sheet_id');
var sheet = spreadSheet.getSheetByName('your_sheet_name');
if (sheet != null) {
return sheet;
}
throw Error;
}
這樣就成功讓 GAS 專案能連接到 Google Sheet 讀取相關資訊
明天再繼續完成寫入&讀取 Google Sheet 的功能
TypeError: Cannot read property 'getName' of null
請問可以怎樣?
表示
var sheet = spreadSheet.getSheetByName('your_sheet_name');
這行的 sheet 沒有成功拿到試算表
可以先確認
var spreadSheet = SpreadsheetApp.openById('your_spread_sheet_id');
var sheet = spreadSheet.getSheetByName('your_sheet_name');
我直接 copy 你提供的 code 的.
var spreadSheet = SpreadsheetApp.openById('id');
Logger.log(spreadSheet .getName());
成功的
var sheet = spreadSheet.getActiveSheet();
變成這句才可???
getActiveSheet() 的功用是取得你當前 spreadSheet 顯示的工作表,當 spreadSheet 只有ㄧ張工作表時是可以直接用getActiveSheet()
。spreadSheet.getSheetByName('your_sheet_name');
則是如果 spreadSheet 有好幾張工作表時,可以指定用工作表名稱指定要取得哪一張工作表。
對不起,看清楚了,sheet name..... 犯了最基本的毛病...... your_sheet_name 我打了 file name.....