Redmine のチケットをスプレッドシートで整理したときに、実際のチケットへのリンクを貼りたいと思い、マクロを作成することにしました。
仕様
選択したセル範囲のセルをすべて走査し、セル内の値が数字であれば、その数字をチケット番号として所定の Redmine へのリンクを貼る、という仕様にしました。
選択したセル範囲をすべて走査するために、
- 選択された複数の矩形のセル範囲 (Range)
- 矩形セル範囲の列
- 矩形セル範囲の行
という形で 3段階のループを回しています。
ソース
Google スプレッドシートでマクロを作る方法は、以下を参照してください。
スクリプトを編集して、作成したマクロは最終的に以下のようになりました。
リンクは HYPERLINK 関数ではなく、RichTextでリンクを貼る方法をとっています。
マクロ.gs
function link_redmine() {
// ベースとなるURL
let baseUrl = 'https://redmine.example.com/issues/';
// 選択範囲の取得
let selection = SpreadsheetApp.getSelection();
let rangeList = selection.getActiveRangeList();
let ranges = rangeList.getRanges();
// 矩形セル範囲
for (let i in ranges) {
let col = ranges[i].getNumColumns();
let row = ranges[i].getNumRows();
// 列
for (let j = 0; j < col; j++) {
// 行
for (let k = 0; k < row; k++) {
let cell = ranges[i].getCell(k + 1, j + 1);
let issueNumber = cell.getValue();
// 数字だけに適用
if (!isNaN(issueNumber) && issueNumber > 0) {
// リンクを設定
let link = baseUrl + issueNumber;
let richText = SpreadsheetApp.newRichTextValue()
.setText(issueNumber)
.setLinkUrl(0, issueNumber.toString().length - 1, link)
.setTextStyle(SpreadsheetApp.newTextStyle().setUnderline(true).build()) // 下線
.build();
cell.setRichTextValue(richText);
}
}
}
}
}
選択したセル範囲のセルすべてに何かを実行する場合、 3段階のループは常套句のように使えると思います。
実行した様子
リンクを貼りたいセルを選択して、マクロを実行。
選択した数字に Redmine チケットの URL が設定されます。
今回は Redmine チケットへのリンクを貼るようにしましたが、スプレッドシートのセル内の値をパラメータとしてリンクできるので、応用範囲は広いと思います。