ご訪問ありがとうございます。
Googleシートマスターのひろしです。
前回
【GAS】指定の数量数分セルをコピーする方法(Gスプレッドシート)
今回は、とっても価値の高い方法をお伝えします。
これを知ることであなたは、
- 配列から最終列を削除し取り出す方法がわかります。
- 指定された数だけ行をコピーする方法がわかります。
なので、サクッとマスターして
と答えてあげてください。
元になった質問
動画はこちら
シートはこちら
*クリックすることでシートが開きます。(コピーしてお使いください)
スクリプト
複数列対応版
function managenorewrite2() {
//読み込み位置
const STRARTROW = 2
const CLMM = 1
const CLMCNT = 4 //数量の位置
//出力する位置
const OUTROW = 3
const OUTCLM = 7
const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
let outbuff = [] //出力バッファ
for (let row = STRARTROW; sh.getLastRow(); row++) {
let buff = []
let wval = sh.getRange(row, CLMM, 1, CLMCNT).getValues() //1行読み込み
console.log("wval=", wval)
if (wval[0][0] == "") {
break
}
let ncnt = wval[0][CLMCNT - 1]
//1行分のデータを作成
for (let i = 0; i < CLMCNT - 1; i++) {
buff.push(wval[0][i])
}
console.log(buff)
console.log("IN outbuff =", outbuff)
//数量分バッファに格納する
for (let i = 0; i < ncnt; i++) {
outbuff.push(buff)
}
console.log("OUT outbuff =", outbuff)
}
sh.getRange(OUTROW, OUTCLM, outbuff.length, CLMCNT - 1).setValues(outbuff)
}
これだと、列を増やすたびにソースコードを直す必要があるので
範囲を引数とした関数にしました。
範囲引数版
/**
* 指定した数だけ行をコピーする
*
* @param {A2:D5} range コピーする範囲です。 ※最終桁はコピーする個数
* @customfunction
*/
function CopyRangeNum(range){
// const sh = SpreadsheetApp.getActiveSheet()
// const range = sh.getRange("A2:D8").getValues()
console.log(range.length)
let outbuff = [] //出力バッファ
for (let i = 0; i < range.length; i++) { //行数分のループ
console.log(range[i])
let cont = range[i].pop()
for (s = 0; s < cont; s++) {
outbuff.push(range[i])
}
}
console.log(outbuff)
return (outbuff)
}
ポイント
- 関数の引数を範囲で取得できる
例) A2:D8 を引数にした場合、選択した範囲が2次元配列として受け取れる
配列.pop()で配列の最後を削除する。かつ、戻り値は配列の最後の値となる
関数の説明を記載することで、こんな感じで本物っぽくなりました。
関数のコメントについての詳細はこちら
【GAS基礎講座】独自(カスタム)関数の説明をかっこよくする方法(JSDOC)
最後までご覧いただきありがとうございます。
つぎはこちら
Googleフォーム登録時に更新日を付加する方法