この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
スプレッドシートでタスク出し(見積もり)をして、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
- github Api
- Google Apps Script
まとめ
このスクリプトのおかげで、登録するだけの作業が効率化されました。Google Apps Scriptで V8ランタイムが指定できるようになった おかげで、自分好みの書き方が出来たと思います。とはいえ、まだまだ改善の余地もありますので、ドッグフーディングして改善していく予定です。