以下のような特殊な要件のために作ったカスタム関数の備忘録
このようなシートがあって
RESULTの列に、各行で値が存在する先頭の値と末尾の値を取得して→でつなげたい
- その行の2列目以降で値が入っている先頭の値と末尾の値を→でつなげて入れる
- 先頭に→があれば左辺の値を取得
- 末尾に→があれば右辺の値を取得
- →がなければそのままの値を入れる
- 先頭と末尾が同じなら→でつなげず先頭の値を入れる
- その行で値が一つだけなら→でつなげずその値を入れる
コード.gs
function getStartEnd() { var result; var sheet = SpreadsheetApp.getActiveSheet(); var row = sheet.getActiveRange().getRow(); var range = sheet.getRange(row, 2, 1, 7); var values = range.getValues(); var rowValues = values[0]; var gotValues = []; for(var i = 0; i < rowValues.length; i++) { var value = rowValues[i]; if(value !== '') { if(value.indexOf('→') !== -1) { value = value.split('→')[0]; } gotValues.push(value); } } if(gotValues.length === 1) { result = gotValues[0]; } else { var start = gotValues[0]; var end = gotValues[gotValues.length-1]; if(start === end) { result = start; } else { result = start + '→' + end; } } return result; } |
意訳この機能がやること resultの入れ物を用意する 開いているシートを取得する 選択されている行を取得する row行目で, 2列目から, 1行, 7列の範囲を取得する その値をすべて取得する [[TODO,TODO,TODO,TODO,TODO,TODO]]のような2次元配列なので[0]で[TODO,TODO,TODO,TODO,TODO,TODO]を取得する gotValuesの入れ物を用意する rowValuesの数だけ繰り返す rowValuesを一つずつ取得して もし空でなければ そしてもし→があれば →の左の値を取得して gotValuesに追加する もしgotValuesの要素が1つなら resultにgotValuesの先頭の要素を入れる もし1つ以上あれば gotValuesの先頭の要素を取得して gotValuesの末尾の要素を取得して もしstartとendの要素が同じなら resultにstartの要素を入れて 同じでなければ resultに start → end の値を入れる resultを返す |
関連記事
自作関数を作成する