カテゴリー: GoogleAppsScript

  • GASでGoogleWorkspaceのメーリングリストと、メーリングリストのメンバーを取得して一覧にするスクリプト

    Google Workspace上のメーリングリスト一覧を整理するために。GoogleWorkspaceの管理機能だと1つずつダウンロードしていくことになるので、GAS(Google Apps Script)で出力するようにした。ベースになるGASのスクリプトは、Copilotに生成させて、それを少しだけ手直しさせた。GoogleのGeminiだと、ベースも作成できず。

    Google Driveから、新規作成で、その他からApps Scriptを選択して、新しいプロジェクトを作り、コード.gsに下記のコードの部分をコピペ。実行するためにAPIを利用するので、サイドのサービスから「Admin SDK API」を追加する。このスクリプトの実行は、Google Workspaceの管理権限の中のGoogle Groupの管理権限があるユーザでないといけない。フル権限である必要はないけれど。

    以下はコード。

    // GASでGoogleWorkspaceのメーリングリストと、メーリングリストのメンバーを取得して一覧にするスクリプト
    // 出力先は、Google spreadsheet
    function myFunction() {
      listMailingListsAndMembers()
    }
    
    // 単機能なら、直接myFunctionの中にいれてもいい。
    // または、呼び出さずに直接実行してもいい。
    function listMailingListsAndMembers() {
      // Spreadsheetはルートフォルダ=マイドライブの直下に保存される。
      var sheet = SpreadsheetApp.create("Mailing Lists and Members").getActiveSheet();
      sheet.appendRow(["Mailing List", "Member"]);
    
      // AdminDirectory. を実施するためには、サービスから「Admin SDK API」を追加する。
      // 実行時に権限を承認する必要がある。また、実行ユーザがGoogleWorkspaceの該当する機能の権限を持っている
      var groups = AdminDirectory.Groups.list({customer: 'my_customer'}).groups;
      if (groups && groups.length > 0) {
        for (var i = 0; i < groups.length; i++) {
          var group = groups[i];
          var members = AdminDirectory.Members.list(group.email).members;
          var memberEmails = [];
          if (members && members.length > 0) {
            // メーリングリスト内のメンバーの数だけ繰り返し
            for (var j = 0; j < members.length; j++) {
              // メーリングリスト内のメンバーを、memberEmailsの配列に追加
              var member = members[j];
              memberEmails.push(member.email);
            }
          } else {
            memberEmails.push("No members");
          }
          // シートに書き込む
          sheet.appendRow([group.email].concat(memberEmails));
        }
      } else {
        sheet.appendRow(["No mailing lists found", ""]);
      }
    }
  • 2023年11月の時点ではGASのJDBCからMySQL8.0に接続できる。

    ついにGoogle App Scriptから、JDBC経由で、Google CloudのCloud SQL のMySQL 8.0のインスタンスに接続を試して、成功した。JDBCがMySQL 8.0  に対応した。(忘れていたけれど、2022年11月も成功していたようだ・・・)

    なお、接続はSSL / TLS クライアント証明書による接続。

    GASサンプルコード:接続して、DB名とバージョンを取得する

    function myFunction() {
      dbConnectionSSL()
    }
    
    // --------------------------------
    // SSLで接続する
    // --------------------------------
    function dbConnectionSSL(){
      Logger.log('start dbConnection function.');
    
      // 接続先設定
      var connectionIp = '34.xx.xx.xx'; // 接続のMysqlのIPアドレス(ホスト名も可)
      var userName = 'username'; // 接続で使うユーザ名
      var passwd = 'passowrd'; // 接続で使うパスワード
      var databaseName = 'CT'; // データベース名
      var addr = 'jdbc:mysql://' + connectionIp + '/' + databaseName + '?useSSL=true';
    
      // SSL用の証明書を変数に入れる
      var clientKey = '\
    -----BEGIN RSA PRIVATE KEY-----\n\
    zylvsBC2kozS3rAxO1KUeD+rUbdDC/0PDbANXi4s/96qEN9vV80WBfH7Ut1TDdWt\n\
    ~~~中略~~~
    wGeppu4uYW4hSE6rATB+GhNwFJtAl1qz4M2nefKWBCc97wmZte/G\n\
    -----END RSA PRIVATE KEY-----';
    
      var clientCert = '\
    -----BEGIN CERTIFICATE-----\n\
    g+vn0NZqwTzhGhfXV9y7k0wsjqN3VjfvLSkSqinYRgDID/vb7FvAD3qyGyTiR9HT\n\
    ~~~中略~~~
    l+AUFjEP\n\
    -----END CERTIFICATE-----';
    
      var serverCa = '\
    -----BEGIN CERTIFICATE-----\n\
    pIa8Cnto3SIGqcwdV1SjA8iS1ohC3t+2igQq9aykOjd51jSQlVRqsE5lYty1VhiX\n\
    ~~~中略~~~
    fCcN9N2TqwxUXmD7g/+5lBi+wf+FBCPml/cyeRvDu5PZIqQ=\n\
    -----END CERTIFICATE-----';
    
      Logger.log('start mysql con');
      Logger.log(addr);
    
      var connectionInfo = {
        user: userName,
        password: passwd,
        _serverSslCertificate: serverCa,
        _clientSslCertificate: clientCert,
        _clientSslKey: clientKey
      }
    
      // DBにコネクションをはるオブジェクトを作る
      var connection = Jdbc.getConnection(addr, connectionInfo);
      Logger.log(connection.getCatalog());
    
      // Select文を実行するための処理
      // sqlステートメントをデータベースに送信するためのオブジェクトを作る
      var statement = connection.createStatement();
    
      // sqlを実行して結果をオブジェクトに入れる
      var result = statement.executeQuery('select @@version;');
    
      // 結果を取り出す
      while (result.next()) {
        var name = result.getString('@@version');
        // ログに出力する
        Logger.log(name);
      }
    
      // コネクションを閉じる
      connection.close();
    
      Logger.log('end');
    }
    
    // -----------------------------------
    // DB Connection close
    // -----------------------------------
    function dbConnectionClose(connection) {
      Logger.log('start db connection close');
    
      connection.close;  
    
      Logger.log('end db connection close');
    }
  • GASのJDBCからMySQL8に接続できるようになった

    約一年ぶりに、GASと、Google CloudのCloud SQLの環境を作った。昨年はできなかったGASから、JDBCを介してのMySQL8への接続を試してみたところ、接続できることがわかった。

    下図は、GASからMySQL8に接続して、バージョン情報を取得しているところ。

    これでMySQLのバージョンを気にすることなく、GASから接続する環境を作れる。

  • Google Apps ScriptのJDBCリファレンスのURL

    毎回、検索するのも大変なので、メモ。

    MySQLなどに接続するときに、Google Apps Script(GAS)からJDBCを使う。そのリファレンスのURLは下記。

    ガイド
    https://developers.google.com/apps-script/guides/jdbc

    JDBCサービスのリファレンス
    https://developers.google.com/apps-script/reference/jdbc

  • GASからMySQLに接続して、コミットする

    通常は、自動コミットされるので、Update文やInsert文を実行したタイミングで、コミットされる。DBへの複数の書き込み処理を、同じタイミングで行うのは、自動コミットをオフにして、手動でコミットする必要がある。

    自動コミットを無効にするには、DBコネクションの「.setAutoCommit(false)」を使用する。

    手動でコミットするには、DBコネクションの「.commit()」を使用する。

    試してみたところ、オートコミットをオフにした場合、「.commit()」を実行しなくても、エラーにはならない。GASのエディタ上でもアラートを上げてくれないので、注意が必要。

    サンプルコード

    function myFunction() {
      dbConnection();
    }
    
    // --------------------------------
    // SSL 接続なしで接続する
    // --------------------------------
    function dbConnection(){
      Logger.log('start dbConnection function.');
    
      // 接続先設定
      var connectionIp = 'xxx.xxx.xxx.xxx'; // 接続のMysqlのIPアドレス(ホスト名も可)
      var userName = 'user'; // 接続で使うユーザ名
      var passwd = 'password'; // 接続で使うパスワード
      var databaseName = 'database'; // データベース名
    
      var addr = 'jdbc:mysql://' + connectionIp + '/' + databaseName;
      Logger.log('start mysql con');
      Logger.log(addr);
    
      var connectionInfo = {
        user: userName,
        password: passwd
      }
    
      // DBにコネクションをはる
      var connection = Jdbc.getConnection(addr, connectionInfo);
      Logger.log(connection.getCatalog());
    
      // オートコミットを無効にして、手動でコミットするようにする。
      connection.setAutoCommit(false);
    
      // sqlステートメントをデータベースに送信するためのオブジェクトを作る
      var statement = connection.createStatement();
    
      // Insert文を発行
      var resultInsert = statement.executeUpdate('Insert Into List (id,listname) values ("5","kanagawa")');
    
      // 実行結果が0なら失敗、1以上なら成功
      Logger.log(resultInsert);
    
      // 手動でコミットする。通常はオートコミットされるので必要なし。
      connection.commit();
    
      // ステートメントを閉じる
      statement.close();
    
      // コネクションを閉じる
      connection.close();
    }
  • GASのDB接続で、オートコミットになっているかを調べる

    コネクションの「.getAutoCommit()」を実行することで、DBへの書き込みがオートコミットになっているかどうかを調べることができる。

    「.getAutoCommit()」の結果が、Trueならオートコミット、Falseなら手動コミット。手動コミットの場合には、「.commit()」を明示的に実行しないとDBにコミットされない。

    サンプルコード

      // DBにコネクションをはる
      var connection = Jdbc.getConnection(addr, connectionInfo);
    
      // オートコミットを無効にして、手動でコミットするようにする。
      connection.setAutoCommit(false);
    
      // Trueならオートコミット、Falseなら手動コミット。ログに書き出す。
      Logger.log('オートコミットの設定: ' + connection.getAutoCommit());
  • GASからMySQLに接続して、Select文を実行する

    select文の実行は、DBへのコネクションを行った後、ステートメントのオブジェクトを作成し、「.executeQuery(‘select文’)」を実行する。実行結果は、「.getInt(‘カラム名’)」や「.getString(‘カラム名’)」などで型を指定して、取得する。

    サンプルコードは下記。

    function myFunction() {
      dbConnection();
    }
    
    // --------------------------------
    // SSL 接続なしで接続する
    // --------------------------------
    function dbConnection(){
      Logger.log('start dbConnection function.');
    
      // 接続先設定
      var connectionIp = 'xxx.xxx.xxx.xxx'; // 接続のMysqlのIPアドレス(ホスト名も可)
      var userName = 'user'; // 接続で使うユーザ名
      var passwd = 'password'; // 接続で使うパスワード
      var databaseName = 'database'; // データベース名
      var addr = 'jdbc:mysql://' + connectionIp + '/' + databaseName;
    
      Logger.log('start mysql con');
      Logger.log(addr);
    
      var connectionInfo = {
        user: userName,
        password: passwd
      }
    
      // DBにコネクションをはる
      var connection = Jdbc.getConnection(addr, connectionInfo);
      Logger.log(connection.getCatalog());
    
      // Select文を実行するための処理 ここから
      // sqlステートメントをデータベースに送信するためのオブジェクトを作る
      var statement = connection.createStatement();
    
      // sqlを実行して結果をオブジェクトに入れる
      var result = statement.executeQuery('select * from List');
    
      // 結果を取り出す
      while (result.next()) {
        // 数値の場合は、getInt('カラム名')を使う。
        var id = result.getInt('id');
        // 文字列の場合は、getString('カラム名')を使う。
        var name = result.getString('listname');
        // 取得した内容をログに出力する
        Logger.log(id + ':' + name);
      }
    
      // Select文を実行する処理はここまで
      // コネクションを閉じる
      connection.close();
    }
  • GASからMySQLに接続して、Insert文を実行する(UpdateやDeleteも)

    Google Apps Script(GAS)で、Insert、Update、Deleteなどの更新系の処理を行うには、DBへのコネクションを行った後、ステートメントのオブジェクトを作成し、「.executeUpdte(‘Insert文など’)」 を実行する。実行結果は、0なら失敗、1以上なら成功(更新した行数が返るので1以上)となる。

    サンプルコードは下記。

    function myFunction() { 
      dbConnection(); 
    }
    
    // -------------------------------- 
    // SSL 接続なしで接続する 
    // -------------------------------- 
    function dbConnection(){ 
      Logger.log('start dbConnection function.'); 
    
      // 接続先設定 
      var connectionIp = 'xxx.xxx.xxx.xxx'; // 接続のMysqlのIPアドレス(ホスト名も可) 
      var userName = 'user'; // 接続で使うユーザ名 
      var passwd = 'password'; // 接続で使うパスワード 
      var databaseName = 'database'; // データベース名
    
      var addr = 'jdbc:mysql://' + connectionIp + '/' + databaseName; 
      Logger.log('start mysql con'); 
      Logger.log(addr);
    
      var connectionInfo = { 
        user: userName, 
        password: passwd 
      }
    
      // DBにコネクションをはる 
      var connection = Jdbc.getConnection(addr, connectionInfo); 
      Logger.log(connection.getCatalog());
    
      // テーブルにInsertを行う処理 
      // sqlステートメントをデータベースに送信するためのオブジェクトを作る 
      var statement = connection.createStatement();
    
      // Insert文を発行 
      var resultInsert = statement.executeUpdate('Insert Into List (id,listname) values ("5","kanagawa")');
    
      // 実行結果が0なら失敗、1以上なら成功 
      Logger.log(resultInsert);
    
      // ステートメントを閉じる 
      statement.close();
      // テーブルにInsertを行う処理はここまで
    
      // コネクションを閉じる 
      connection.close(); 
    }
  • GASの文字列結合

    Google Apps Script(GAS)での文字列結合は、+を使う。

    // 文字列結合して、あいうえお にする 
    var str = 'あいう' + 'えお';
  • GASからCloud SQL(MySQL)に接続するコード

    Google Apps Scripsから、Google Cloud SQLのMySQLに接続するコードのサンプル。このとき、Cloud SQLのMySQLは、MySQL 5.7よりも古くないと接続できない。

    DBへの接続は、JDBCを使用する。このとき、JDBCの読み込みは必要なく、GASのエディタ上で直接記述してよい。このサンプルでは、SSL(TLS)を使わないバージョン。通信経路が暗号化されないので、注意が必要。

    接続のチェックのため、コンソールログに、いろいろと書き出すようにしている。Logの部分はなくても、問題なし。

    function myFunction() {
      dbConnection();
    }
    // --------------------------------
    // SSL 接続なしで接続する
    // --------------------------------
    function dbConnection(){
      Logger.log('start dbConnection function.');
      // 接続先設定
      var connectionIp = 'xxx.xxx.xxx.xxx'; // 接続のMysqlのIPアドレス(ホスト名があれば、ホスト名も可)
      var userName = 'user'; // 接続で使うユーザ名
      var passwd = 'password'; // 接続で使うパスワード 変数名をpasswdにしているのは、コネクションInfoの作成時にキーワードと変数が同じになるのを避けるため。
      var databaseName = 'dbname'; // データベース名
      var addr = 'jdbc:mysql://' + connectionIp + '/' + databaseName;
      Logger.log('start mysql con');
      Logger.log(addr);
      var connectionInfo = {
        user: userName,
        password: passwd
      }
      var connection = Jdbc.getConnection(addr, connectionInfo);
      // 接続できたことを確かめるために、ログにDB名を出力。
      Logger.log(connection.getCatalog());
      // コネクションを閉じる
      connection.close();
      Logger.log('end');
    }