F.Ko-Jiの「一秒後は未来」

GoogleドキュメントのフォームからGoogle Apps ScriptでGitHubのIssuesに投稿する

簡単にお問い合わせフォームが作れたりする Google ドキュメント(現在はGoogle ドライブ)のフォーム機能はとても便利です。しかし、基本的にフォームから送信される内容はスプレッドシートに自動入力されるだけで、その後のもろもろの管理をおこなうにはちょっと不便です。

これがもし自動的にチケット管理システムに投稿できたら便利なのになぁ・・・と思って、ふと Google Apps Script を調べてみると、ありがたいことに HTTP リクエストを送信できるクラスが用意されているではありませんか。一方で GitHub の API にも Issues に投稿するための API が用意されている。

ということは、この2つを連携させれば Google ドキュメントのフォームから送信された内容を GitHub の Issues に自動投稿することができる、ということになりますね。

GitHubのアクセストークンの取得

まずは前回書いた記事「OAuth認証でGitHub APIのアクセストークンを取得する」を参考にアクセストークンを取得しておきます。

取得したアクセストークンは、次に説明する Google Apps Script の中で使用します。

スプレッドシートの内容を Google Apps Script で取得する

次に Google ドキュメントのスプレッドシートにスクリプトを設定します。

設定方法は「Googleドキュメントのフォーム機能からGoogle Apps Scriptを使ってメール送信 [C!]」という記事が分かりやすいです。ほぼこの通りで。

で、この記事ではメール送信処理をおこなっていますが、その部分を GitHub の API に POST するように書き換えていきます。

Google Apps Script を使って GitHub の Issues に POST する

Google Apps Acript で POST リクエストを送信するには UrlFetchApp クラスの fetch メソッドを使います。

GitHub の API は JSON 形式のデータを POST しないといけないので、以下のようなスクリプトになります。

  var githubAccessToken = '取得したアクセストークン'
    , githubApiUrl = 'https://api.github.com/repos/ユーザー名/リポジトリ名/issues';

    // Issues に POST
    var response = UrlFetchApp.fetch(githubApiUrl, {
      "method": "post",
      "headers": {
        "Content-type": "application/json",
        "Authorization": "token " + githubAccessToken
      },
      "payload": JSON.stringify({
        "title": 'ここにタイトル',
        "body": 'ここに本文', // lines.join("\n"),
        "labels": ['inquiry']   // 存在するラベルを指定可能
      })
    });

    var issueUrl = '';
    
    // POST に成功したら issue の URL を取得してメール通知
    if (response.getResponseCode() == 201) {
      var json = JSON.parse(response.getContentText());
      issueUrl = json.html_url;
      MailApp.sendEmail("宛先", "New Issue Posted!", issueUrl);
    }

POST するデータには labels でラベルを指定できるので、お問い合わせ用にラベルを用意しておくと自動的に分類できて便利です。ラベルはGitHubのほうであらかじめ作成しておいてください。他に使えるオプションはドキュメントを参照のこと。

また、上記スクリプトのように投稿に成功したらメール通知するようにしておいてもいいと思います。

参考に全体のスクリプトを掲載しておきます。

function postToGitHubIssues() {
  var githubAccessToken = 'アクセストークン'
    , githubApiUrl = 'https://api.github.com/repos/ユーザー名/リポジトリ名/issues'
    , adminMail = 'メール送信先';

  try {
    var sheet = SpreadsheetApp.getActiveSheet();
    var url = SpreadsheetApp.getActiveSpreadsheet().getUrl();
    var lastRowNum = sheet.getLastRow();
    var lastColNum = sheet.getLastColumn();
    var range = sheet.getDataRange();

    var lines = [];

    // colは1から
    for (var col = 1; col <= lastColNum; col++) {
      var name = range.getCell(1, col).getValue();
      var value = range.getCell(lastRowNum, col).getValue();
      var line = '【'+name+'】 '+value;
      lines.push(line);
    }

    var response = UrlFetchApp.fetch(githubApiUrl, {
      "method": "post",
      "headers": {
        "Content-type": "application/json",
        "Authorization": "token " + githubAccessToken
      },
      "payload": JSON.stringify({
        "title": 'ここにタイトル',
        "body": 'ここに本文', // lines.join("\n"),
        "labels": ['inquiry']   // 存在するラベルを指定可能
      })
    });
    
    var issueUrl = '';
    
    if (response.getResponseCode() == 201) {
      var json = JSON.parse(response.getContentText());
      issueUrl = json.html_url;
      MailApp.sendEmail(adminMail, "New Issue Posted!", issueUrl);
    }
  } catch (e) {
    MailApp.sendEmail(adminMail, "Error!", e);
  }
}

Google Apps Script かなり便利ですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など