カテゴリー: GoogleAppsScript

  • 2021年12月の時点でも、GASのJDBCからMySQL8.0に接続できない。

    昨年、Google App Scriptから、JDBC経由で、Google CloudのCloud SQL のMySQL 8.0のインスタンスに接続を試して、失敗した。JDBCがMySQL 8.0  に対応しておらず、接続エラーになるというものだった。

    あれから1年がたち、もう一度、試してみたが、Google App ScriptからJDBCを使って、MySQL 8.0のインスタンスに接続することはできなかった。まだ、MySQL 5.7のインスタンスまでしか対応していない。

    MySQL 5.7 のインスタンスには、GASから正常にアクセスできていることも、ついでに確認した。

  • Google ChatのチャットボットのAPIのリファレンス

    Google ChatのチャットボットのAPIのGoogleの公式リファレンスのURL。

    https://developers.google.com/chat/concepts

    カード形式のやり方とか、Node.jsでwebhookとか、いろいろな使い方が掲載されている。

  • GASのGoogle ChatのChat Botを作成して公開する手順

    久しぶりにGASで書いたChatbotのテストをしようとしたら、デプロイ方法が変わっていたので、書き直し。

    作成フェーズ

    1. Chat Bot のサンプルプロジェクトのファイルを開く
    2. プロジェクト名をつけて保存する
    3. GASのコードを書く

    デプロイ1(スクリプトエディタ側)

    1. GASのスクリプトエディタで、「公開」→「マニフェストから配置」の順にクリックする。
    2. どのバージョンをデプロイするのかを聞かれるので、「最新」を選び「Get ID」をクリックする。
    3. 表示された「Deployment ID」の値をコピーしておく(テキストに張り付けておくとよい)。
    4. 「Close」をクリックして閉じる。

    デプロイ2(Google Cloud Platform側)

    1. GASのスクリプトエディタとは別のタブで、Cloud Platformを開く。( https://console.cloud.google.com/ )
    2. Cloud Platformにログインする。
    3. 上部のメニュー部分のプロジェクト選択の部分をクリックして、ポップアップされた画面で、「新しいプロジェクト」を選択する。
    4. プロジェクト名などを入力して作成する。
    5. 左上のナビゲーションメニュから「APIとサービス」を選択する。
    6. 「+APIとサービスの有効化」をクリックする。
    7. 検索で、「chat」を入力する。
    8. 「Hangouts Chat API」を選択する(ここは、まだ古い名称のままだった)。
    9. 「有効にする」をクリックする。
    10. 左のメニューから「認証情報」をクリックする。
    11. 「+認証情報を作成」をクリックする。
    12. 「サービスアカウント」を選択する。
    13. サービスアカウントの名前などを入力して、作成する。
    14. 権限をクリックする。
    15. 「アクセスを許可」をクリックし、作成したサービスアカウントに「Project」の「オーナー」の権限をつける。
    16. (IAMの画面になっている場合は)左上のナビゲーションメニュから「APIとサービス」を選択する。
    17. 表示されているAPIの中から「Hangouts Chat API」をクリックする。
    18. 左のメニューから「設定」をクリックする。
    19. ボットの名前を入力する
    20. アバターのURLを入力する(https://goo.gl/yKKjbw)
    21. 説明を入力する。
    22. 機能を選択する(用途に合わせて選択する)
    23. 接続設定で、「Apps script project」を選択する。
    24. デプロイIDに、上記で取得した「Deployment ID」の値を入れる。
    25. 権限を選択する。
    26. 保存をクリックする。

    以上で、公開は完了。

    あとは、Google Chatからボットを検索して利用する。

  • GASからJDBCでCloud SQLに接続しようとすると接続が確立できない

    GAS(Google Apps Script)から、Cloud SQLに接続をJDBCから行ったのだが、下記のエラーが出て接続できない。

    Exception: データベース接続を確立できませんでした。接続文字列、ユーザー名、パスワードを確認してください。

    接続先の環境は、Cloud SQL(Google Cloud Platform SQL)上で新しく作ったインスタンスで、第2世代で、MySQL8.0のインスタンス。

    GASのソースコードとしては、下記。

    function dbConn() {
      var dbConnectName = "プロジェクト名:us-central1:インスタンス名"; // GCP上で表示される接続名
      var user = "ユーザ名";
      var password = "パスワード";
      var dbName = "DB名";
      
      var conURL = "jdbc:google:mysql://" + dbConnectName + "/" + dbName;
      Logger.log(conURL);
      
      var dbCon = Jdbc.getCloudSqlConnection(conURL, user, password);
      Logger.log(dbCon.getCatalog());
      
      return dbCon;
    }

    いろいろと調べて、JDBCの`Jdbc.getConnection`でも試したが、接続できず。

    原因として、わかったことは、GASから呼び出されるJDBCは、MySQL8.0へのインスタンスへの接続に対応していないということ。MySQL5.7で新しくインスタンスを作り直して、`Jdbc.getCloudSqlConnection`を行ったところ、あっさりと接続できた。

    まさか、JDBCが対応していないとは。

  • GASで求められるexternal_requestの権限について

    GASで、プロジェクトのプロパティのスコープに下記の権限があったとき、これが何の権限を求めているのか。

     https://www.googleapis.com/auth/script.external_request

    この権限は、UrlFetchAppを使用するために使用される。

     //例えば、このようなコードを書いたときに必要になる。
     var response = UrlFetchApp.fetch( "http://www.google.com/");
     Logger.log(response.getContentText()); 
    

    参考:

    https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app

  • GASのウェブアプリをIEで使うと、POSTしたデータが文字化けする

    Google Apps Scripts(GAS)で、ウェブアプリを作成できる。 IEでそのフォームを使って、Spreadsheetにデータの書き込みをすると文字化けする。 Chromeだと、問題なく文字化けせず書き込める。

    GASのウェブアプリなので、いろいろと制限だらけなので、HTMLの文字コードの指定などもうまくいかず。 ブラウザでの文字コードの認識を確認してみると、ChromeではUTF-8、IE11はUTF-8以外で認識されていた。 GASのウェブアプリにアクセスした際に、ブラウザをみて文字コードを変えているようで、IE11でUTF-8を指定すると文字化けする。

    GASのコードで文字コードの指定をしたが、UTF-8で指定されず。 いろいろと試した結果、フォームに送信するときの文字コード指定するコードして、UTF-8でPOSTすることにより、IE11でもPOSTしたデータの文字化けを防ぐことができた。

    formタグで、「accept-charset=”utf-8″」を指定することで、データ送信時の文字コードをUTF-8(それ以外も可)にすることができる。

  • GASでセッションからユーザのEmailアドレスを取得する

    G Suiteの環境でGAS(Google Apps Script)を動作させる場合、セッションから実行・アクセスしているユーザのEmailアドレスを取得することができる。

      // セッションからユーザのEmailアドレスを取得する
      var userEmail = Session.getActiveUser().getEmail();
    

    なお、取得できるのはEmailアドレスのみ。ユーザの名前などを取得できないかどうかを探したができなかった。

  • Fusion Tablesが廃止される

    Notice: Google Fusion Tables Turndown
    https://support.google.com/fusiontables/answer/9185417?hl=en

    Googleより、「Fusion Tables」を廃止するとメール通知があった。「Fusion Tables」の廃止日は、2019年12月3日とのこと。2019年8月より、MAP APIでは警告が表示される。データダウンロードのためのGoogle Takeoutは2019年3月から提供されるとのこと。

    現実的な移行先は、Googleスプレッドシートか、Google Cloud SQL。Cloud SQLは、利用料金がかかってしまうので、無料というわけにはいかない。かつ、使い勝手が大きく変わるので、辛いかも。データの可視化は、GoogleデータポータルからCloud SQLにつなげてやるのがよさそう。

  • Chat Botのボタンをクリックしたときに発生するイベント

    Hangouts ChatのチャットボットをGASで作る場合、カードの中のボタンをクリックしたときに発生するイベントは、onCardClick()イベント。

    カードに設定したボタンの`actionMethodName`で設定したをユニークにすることで、複数のボタンを識別することができる。

    /**
     * Card click event handler
     **/
    function onCardClick(e) {
    
      // button is clicked.
      if (e.action.actionMethodName === '****') {
        return ******;
      }
    
    }
    
  • Fusion Tablesで日本語文字列で検索できない問題の対処

    Where句でのシングルクォートとダブルクォートの違いが原因。
    Fusion Tablesでは、文字列の囲みは、シングルクォートを使う。ダブルクォートの場合、解釈されず、エラーになる。

    検証していて厄介だったのは、Where句を用いた検索で、ダブルクォートを使うと、中身が数字だと検索できるのに、中身がマルチバイト文字列だとエラーになる。
    しかも、FusionTables.Query.sqlGet(sql)でクラッシュする。

    OKパターン

      var sql = 'select * from ' + tableId;
      sql += " where name like '%" + keyWord + "%'";
    

    NGパターン

      var sql = 'select * from ' + tableId;
      sql += ' where name like "%' + keyWord + '%" ';
    

    Fusion TableのSQLは、厳密に”を解釈するようだ。