【GAS】指定された数だけ行をコピーする方法 2次元配列(pop)

応用

GAS応用の一覧

ご訪問ありがとうございます。

Googleシートマスターのひろしです。

前回

【GAS】指定の数量数分セルをコピーする方法(Gスプレッドシート)
  • 2次元配列への格納方法がわかります。
  • setValuesの使い方がわかります。
  • 今回は、とっても価値の高い方法をお伝えします。


    これを知ることであなたは、

    • 配列から最終列を削除し取り出す方法がわかります。
    • 指定された数だけ行をコピーする方法がわかります。

    なので、サクッとマスターして

    と答えてあげてください。

     

    元になった質問

     

     

     

    動画はこちら

    【GAS】Googleスプレッドシード 指定された数だけ行をコピペ 2次元配列 pop

    シートはこちら

    *クリックすることでシートが開きます。

     

    スクリプト

    複数列対応版
    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フォーム登録時に更新日を付加する方法
  • Googleフォームの入力値を簡単に取得できるようになります。
  • 適切に更新日を追加することができます。
  • GAS応用の一覧

    コメント

    タイトルとURLをコピーしました