GAS(Google App Script)からAWS API Gatewayを呼び出す
Google CalendarからLINE通知とかやってみたかったのですが、GASにLINEのSDKを入れると容量オーバーになる様子でした。 なので使い慣れたAWS API Gateway + Lambdaに処理を移譲し […]
広告ここから
広告ここまで
目次
Google CalendarからLINE通知とかやってみたかったのですが、GASにLINEのSDKを入れると容量オーバーになる様子でした。
なので使い慣れたAWS API Gateway + Lambdaに処理を移譲し、GASはAPIを叩くだけにしてみます。
API Gatewayの設定
Serverless Frameworkで簡単に設定しておきます。
$ sls create -t aws-nodejs-typescript -p example-apis
APIを誰でも叩けるのはちょっと困るので、APIキーによる認証をつけておきましょう。
service:
name: example-apis
provider:
name: aws
runtime: nodejs10.x
logRetentionInDays: 14
region: ap-northeast-1
stage: development
timeout: 300
apiKeys:
- ${opt:stage, self:provider.stage}-example-api
functions:
hello:
handler: handler.hello
events:
- http:
method: post
path: notify
private: true
GAS側のコードをTypeScriptで
GASの[ファイル > プロジェクトのプロパティ > スクリプトのプロパティ]にAPI_KEY
という名前でAPI GatewayのAPIキーを保存しておきます。
あとはUrlFetchApp
を使ってAPIを呼び出してやればOKです。
export function getUpdatedCalander(e: GoogleAppsScript.Events.CalendarEventUpdated): void {
try {
console.log(e)
const calander = CalendarApp.getCalendarById(e.calendarId)
const today = new Date()
const next = new Date()
next.setMonth(next.getMonth() + 2)
const event = calander.getEvents( today, next )
const props: {name: string][] = []
event.forEach(eve => {
props.push({name: eve.getTitle()})
})
const apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY')
if (!apiKey) throw new Error('No API_KEY')
const options: GoogleAppsScript.URL_Fetch.URLFetchRequestOptions = {
method: 'post',
headers: {
'x-api-key': apiKey
},
payload: JSON.stringify(props)
}
const result = UrlFetchApp.fetch('https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/development/notify', options)
console.log(result)
} catch (e) {
console.log(e)
}
}
はまったところ
Promiseやasync / awaitはGASだと(2019/08時点では)利用できない様子です。
ReferenceError: "Promise" is not defined.
などのエラーを出されました。
また、https://www.googleapis.com/auth/script.external_request
のパーミッションが必要ですので、すでに有効化しているトリガーは再設定が必要です。