iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
自我挑戰組

從無到有打造驗證碼共享的 Line 機器人系列 第 4

利用 Google App Script 將資料存到 Google Sheet(1)

昨天我們利用 GAS 讀取了篩選郵件的內容
今天我們要進一步將資料存到 Google Sheet 以供 Line Messaging Api 讀取

寫在前頭

篩選郵件的內容其實可以優化到限制只獲取 Netflix 驗證碼相關的信件中的驗證碼
但因為這牽涉到 Netflix 驗證碼信件的格式,所以這邊就不多做示範
接下來的內容一律先用假資料驗證信去完成,信件內容如下:
fake validation mail

步驟

因為目標是將之前建置的 GAS 專案可以讀取指定的信件內容,並且將驗證碼存到 Google Sheet 中,這可以拆解成以下幾個功能:

  1. readMail
  2. connectToSheet
  3. insertToSheet
  4. readFromSheet

修改專案架構

首先將 GAS 專案架構修改如下圖,這樣才不會所有程式碼都擠在一起變超長
project layout
入口點為 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();
}

使用 Google Sheet API

跟串接 Gmail 服務一樣,要使用 Google Sheet 首先要新增 Google Sheet Api 的服務
add 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 讓我們存放資料

有資料庫概念的人,可以把 Google Sheet 想像成 Database,而裡面每張 Sheet 等同於 Table
如此一來就可以規劃我們的存放資料的欄位

注意:畢竟 Google Sheet 不是真的資料庫,也許他可以應付輕量存取或簡單的用途,但不要期望他能做到跟真正的資料庫一樣

建立完的 Google Sheet 如下
google sheet image

接著打開共用,選擇知道連結的人都能編輯

GAS 專案連結 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 的功能


上一篇
建立 Google App Script 專案(2)
下一篇
利用 Google App Script 將資料存到 Google Sheet(2)
系列文
從無到有打造驗證碼共享的 Line 機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
blanksoul12
iT邦研究生 5 級 ‧ 2021-09-15 17:32:20

TypeError: Cannot read property 'getName' of null

請問可以怎樣?

看更多先前的回應...收起先前的回應...
Miyuki iT邦新手 4 級 ‧ 2021-09-15 18:03:37 檢舉

表示

var sheet = spreadSheet.getSheetByName('your_sheet_name');

這行的 sheet 沒有成功拿到試算表

可以先確認

  1. 以下這行的 Spread Sheet Id 是否填寫正確 (將 your_spread_sheet_id 置換成你想連線的 googel sheet id)
var spreadSheet = SpreadsheetApp.openById('your_spread_sheet_id');
  1. 以下這行的 sheet name 是否填寫正確 (將 your_sheet_name 置換成你想連線的工作表名稱)
  var sheet = spreadSheet.getSheetByName('your_sheet_name');
  1. 該張 googel sheet 是否有成功設定共用
blanksoul12 iT邦研究生 5 級 ‧ 2021-09-16 08:57:37 檢舉

我直接 copy 你提供的 code 的.

blanksoul12 iT邦研究生 5 級 ‧ 2021-09-16 10:33:35 檢舉
var spreadSheet  = SpreadsheetApp.openById('id');
  Logger.log(spreadSheet .getName());

成功的

blanksoul12 iT邦研究生 5 級 ‧ 2021-09-16 10:42:12 檢舉
var sheet = spreadSheet.getActiveSheet();

變成這句才可???

Miyuki iT邦新手 4 級 ‧ 2021-09-16 23:32:17 檢舉

getActiveSheet() 的功用是取得你當前 spreadSheet 顯示的工作表,當 spreadSheet 只有ㄧ張工作表時是可以直接用getActiveSheet()
spreadSheet.getSheetByName('your_sheet_name'); 則是如果 spreadSheet 有好幾張工作表時,可以指定用工作表名稱指定要取得哪一張工作表。

blanksoul12 iT邦研究生 5 級 ‧ 2021-09-17 09:12:24 檢舉

對不起,看清楚了,sheet name..... 犯了最基本的毛病...... your_sheet_name 我打了 file name.....

我要留言

立即登入留言