Googleスプレッドシートからgithub issueを簡単に作成して作業効率化

Google Apps Script で作業効率化をしたという話。 github issue と連携します。
2020.02.24

はじめに

スプレッドシートでタスク出し(見積もり)をして、githubのissueでタスクを管理することってありますよね。そんなときに便利なスクリプトを書いたのでブログに残しておきます。

想定される利用シーン

  • タスク見積もりや洗い出しにGoogleスプレッドシートを使っている
  • タスクの進捗管理にはgithub issueを利用している

スクリプト実行時のイメージ

スプレッドシートの A2 〜 C6 の範囲をissue化します。

メニューの [スクリプト] > [issue作成] を押下するとダイアログが表示され、 OK を選択するとgithubにissueをモリモリ作ります。

スクリプトが終了したら githubのissueを開くと、issueが追加されていますね。

スクリプト

前提

  • github で issueを作れる権限のaccesstokenを発行しておく
  • プロジェクトのプロパティに以下の項目を設定
    • username : リポジトリのユーザ名(リポジトリPathに利用)
    • repository : リポジトリ名(リポジトリPathに利用)
    • accesstoken : github のアクセストークン

V8ランタイムを指定

スクリプトエディタよりV8ランタイムを指定してください

スクリプト

// github issue 作成エンドポイント
const githuburl = (username, repository) => `https://api.github.com/repos/${username}/${repository}/issues`;

// request 作成関数
const create_request = (url, accesstoken) => {
  return (payload) => 
    ({
      url: url,
      method: "post",
      headers: {
      Authorization : `token ${accesstoken}`
    },
      payload: payload
    });
};

const create_issue = () => {
  // シート情報取得
  SpreadsheetApp.getActiveSpreadsheet();
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const issueCount = lastRow - 1;
  const range = sheet.getRange(2,1,issueCount,3); // A2 - C[issueCount]の範囲
  const issueRows = range.getValues();

  // issue 情報
  const issues = issueRows.map(row => ({title: row[0], body: row[1], labels: raw[2] ? row[2].split(',') : []})); 

  // スクリプトのプロパティ
  const properties = PropertiesService.getScriptProperties();
  const accesstoken = properties.getProperty("accesstoken");
  const username = properties.getProperty("username");
  const repository = properties.getProperty("repository");

  // url
  const url = githuburl(username, repository);

  // リクエスト作成用の関数作成
  const request = create_request(url, accesstoken);

  // リクエスト作成
  const requests = issues.map(issue => request(JSON.stringify(issue)));
  Logger.log(requests);

  // issue 作成リクエスト送信
  UrlFetchApp.fetchAll(requests);
}; 

// 確認
const confirmation = () => {
  const confirmed = Browser.msgBox("github issue を作成しますか?", Browser.Buttons.OK_CANCEL);
  if(confirmed == 'ok') {
    create_issue()
  }
};

// ファイルを開いたときにメニューを追加する
const onOpen = () => {
  const myMenu = [
    {name: "Issue作成", functionName: "confirmation"}
  ];
  SpreadsheetApp.getActiveSpreadsheet().addMenu("スクリプト",myMenu); //メニューを追加
};

注意事項

  • issueに付与するラベルは、issueを作る前にgithubで作っておいたほうがよい
    • github上にラベルが存在しない場合は、同じラベルが複数作成される可能性があります
  • issue化する範囲は指定できない
    • 2行目以降で入力がある行はすべてissue化してしまいます

利用したAPI

まとめ

このスクリプトのおかげで、登録するだけの作業が効率化されました。Google Apps Scriptで V8ランタイムが指定できるようになった おかげで、自分好みの書き方が出来たと思います。とはいえ、まだまだ改善の余地もありますので、ドッグフーディングして改善していく予定です。