Power Automate

Google Apps ScriptとPower Automateの連携事例紹介

今回の記事は、ガイアックスさん主催のイベント「Google Apps Script 活用トーク #7」のLTでお話しさせていただいた内容の補足になります。

Google Apps Script 活用トークとは?

ガイアックスさんは「Gaiax Technical Meetups」として定期的に技術系のイベントを開催されていて、「Google Apps Script 活用トーク」はその名の通り、Google Apps Scriptの活用事例の紹介を中心としたイベントです(通称、GAS活)。

これまでは「Google Apps Script 活用ミートアップ」としてオフラインでイベントが行われていましたが、コロナ禍により前回から開催の場をオンラインに移しています。

私もこれまで何度か参加させていただきました。

今回のイベントでは、GASとPower Automateの連携の一例として、“OneDriveにWordやExcel、PowerPointファイルがアップされたら、Googleドキュメント、スプレッドシート、スライドに変換してファイル共有し、共有リンクを取得するフロー”について、LT枠でお話しさせていただきました。

以下、GASでの処理やPower Automateのフローについて解説していきます。

処理概要

今回のLTで紹介した処理の工程は、大まかには下記の通りです。

  • Power Automate
    1. トリガー:OneDriveにファイルをアップ
    2. アップされたファイルをBase64エンコード
    3. エンコードした文字列をGAS(ウェブアプリケーションとして導入)にPOST
  • Google Apps Script
    1. POSTされた文字列をデコードしてファイル変換
    2. 変換したファイルをGoogleドライブに保存
    3. ファイル共有し、リンクを返す

Google Apps Script側の処理

まずはデータを受け取るGAS側の処理について解説します。

  1. スクリプトエディタに下記コードを貼り付け、変換したファイルを保存するフォルダのIDを入力します。フォルダIDの取得方法はこちらの記事をご参照ください。
  2. //ファイルをBase64文字列で受け取りスライド等で保存、共有リンクを返す
    function doPost(e) {
      const body = e.parameter.body.replace(/ /g, "+"); //POST時に+が消えるので元に戻す。
      const fileName = e.parameter.name;
      const pos = fileName.lastIndexOf(".");
      let baseName, ext, fileType;
      if (pos !== -1) {
        baseName = fileName.substring(0, pos);
        ext = fileName.slice(pos + 1).toLowerCase();
      } else {
        baseName = fileName;
        ext = "";
      }
      switch (ext) {
        case "pptx":
          fileType = MimeType.GOOGLE_SLIDES;
          break;
        case "xlsx":
          fileType = MimeType.GOOGLE_SHEETS;
          break;
        case "docx":
          fileType = MimeType.GOOGLE_DOCS;
          break;
        default:
          return;
      }
      //console.log(fileName + "," + baseName + ", " + ext + ", " + fileType + ", " + body); //確認用
      const file = Drive.Files.insert({
        title: baseName,
        mimeType: fileType,
        parents:[{
          "id": "(ここに保存先フォルダIDを入力)" //保存先フォルダID
        }]
      }, Utilities.newBlob(Utilities.base64Decode(body)));
      DriveApp.getFileById(file.id).setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW); //ファイル共有設定
      return ContentService.createTextOutput(file.alternateLink); //ファイルを開くためのリンクを返す。「embedLink」でも可
    }
    
    //アクセストークン取得&使用サービス確認用
    function getAccessToken() {
      Logger.log(ScriptApp.getOAuthToken()); //Authorization: Bearer 以降に貼り付け
    }
  3. 「リソース」メニューにある「Google の拡張サービス」から「Drive API」をオンにして「OK」ボタンをクリックします。
  4. 「getAccessToken」関数を実行し、ログとして出力されるアクセストークンをメモ帳などに貼り付けておきます。このとき確認ダイアログが表示されるので、画面の指示にしたがってアクセスを許可しておきます。
  5. 「公開」メニューから「ウェブ アプリケーションとして導入」をクリックします。
  6. プロジェクトバージョンは「新規作成」、次のユーザーとしてアプリケーションを実行は「自分」、アプリケーションにアクセスできるユーザーは「自分だけ」として、「導入」ボタンをクリックします。 ※下図はダイアログが英語表記になっています。
  7. 「現在のウェブ アプリケーションのURL」が発行されるので、アクセストークンと同様にコピーしておきます。このURLがPower Automateから呼び出すURLになります。

以上でGAS側の準備は完了です。

関連記事

Power Automateのフロー

次はPower Automateのフローについて解説します。

  1. Power Automateで「自動フロー」を作成し、トリガーにはOneDrive for Businessの「ファイルが作成されたとき」を選択します。
  2. 監視対象となるフォルダを選択します。今回はOneDrive上の「toGAS」フォルダを対象としました。
  3. 新しいステップから「変数を初期化する」を選択し、下図のように「ファイル名」を文字列変数とします。
  4. 新しいステップから「作成」を選択し、入力欄には下記式を入力します。ステップ名は「ファイルコンテンツの取得」としておきます。
  5. @{base64(triggerOutputs()?['body'])}

  6. 新しいステップから「HTTP」を選択し、各パラメーターを下記のように設定します。ステップ名は「リダイレクト先取得」としておきます。
  7. ・方法:POST
    ・URI:GASでウェブアプリケーションとして公開した際に発行されたURL
    ・ヘッダー(Content-Type):application/x-www-form-urlencoded
    ・ヘッダー(Authorization):Bearer +GASでコピーしたアクセストークン ※Bearerとトークンの間には半角スペースを入れる
    ・本文:

    name=@{uriComponent(variables('ファイル名'))}&body=@{outputs('ファイルコンテンツの取得')}

  8. 新しいステップから「作成」を選択し、下記のようにリダイレクト先のURLを取得します。ステップ名は「Location」としておきます。このとき、「実行条件の構成」から「に失敗しました」もチェックしておきます。
  9. @{outputs('リダイレクト先取得')['headers']['Location']}

  10. 新しいステップから「HTTP」を選択し、各パラメーターを下記のように設定します。
  11. ・方法:GET
    ・URI:

    @{outputs('Location')}

以上でフローの作成は完了です。

注意点

上記フローで使用した「HTTP」コネクタは“プレミアムコネクタ”です。
Office 365、あるいはMicrosoft 365の一部プランに含まれるPower Automateでは利用できませんのでご注意ください。

詳細については下記参考サイト、あるいはライセンスガイドをご参照ください。

フロー全体図

作成したフローの全体図は下記になります。

フローの実行結果

フローをテスト実行すると、問題がなければ下図のように、アップしたMS Office文書がGoogle Office文書に変換され、共有リンクが返ってきます。

フローの途中でUnauthorizedエラーが発生している場合は、アクセストークンを発行し直して再度動作確認してみてください。

おわりに

上記の通り、Google Apps ScriptとPower AutomateのようなiPaaSを組み合わせることで、SlackやTeams等、様々なWebサービスとローコードで繋がることができ、処理の幅は大きく広がります。

アイデア次第で様々な場面でスクリプトが活用できるようになるので、Google Apps Scriptをお使いの方は、是非iPaaSとの組み合わせも考えてみてください!

また今回は、ウェブアプリケーションとして公開したスクリプトを呼び出しましたが、Apps Script APIを使ってWeb API化したスクリプトを実行するのが本筋だろうとは思います。

Apps Script APIについてはここでは解説しませんので、上記参考サイトをご参照ください。

Project Oakdaleのテーブルに5000件のデータをインポートしてみました。前のページ

2020年11月の人気記事次のページ

関連記事

  1. Google関連

    [Google Apps Script]スプレッドシートをExcelファイル(xlsx)に変換する

    スプレッドシートのファイルメニュー → 形式を指定してダウンロード →…

  2. Office関連

    オフィス祭り 2018 in 東京に参加しました。

    先日書いた下記記事の通り、9月15日(土)に品川にある日本マイクロソフ…

  3. Google関連

    [Google Apps Script]スプレッドシートで検索と置換を行う

    Google スプレッドシートには、検索と置換機能(Ctrl + F)…

  4. イベント関連

    【感想】特別展「深海2017」に行ってきたよ(5)

    前回の記事の続きです。先生たちからのメッセージ…

  5. Google関連

    [Google Apps Script]URL Shortener APIを使って短縮URLを取得す…

    2015/7/14 追記:いつの間にかAPIの呼び出しにAPI…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

PAGE TOP