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のパーミッションが必要ですので、すでに有効化しているトリガーは再設定が必要です。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark