URLをコピーしました!
スキルアップを始める!

【GAS】特定の列で空白セルが見つかったらその行にデータを書き込む

GAS(GoogleAppsScript)

Google Apps Script(GAS)を使用して、Google Sheetsの特定の列で空白セルが見つかった場合に、その行にデータを書き込む方法について説明します。

以前、「シート内のチェックが入った行を別シートに転記したい」という話を書きましたが、その続きのような内容です。

チェックが入ったら別のシートに転記するスクリプト

以前、このような「チェックが入ったら別のシートに転記するスクリプト」を作りました。

チェックを入れた行が別のシートに転記されます。便利ですね。

発行IDを発番したい

今回の要件は、少し内容を変えて「予め発行されているID列を、チェックを入れたタイミングで次々に付与したい」という内容です。

実行:列のチェックが入る。

結果:別シートに、予め発行されたIDを付与して追加する。

このような感じの内容です。

前回までの復習

前回まではこのような感じの内容で作成しました。destValuesとsetValuesで別シートにデータを転記しています。

function copyData(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName('Sheet1'); // チェックボックスがあるシート名
  var sheet2 = ss.getSheetByName('Sheet2'); // コピー先のシート名
  var range = sheet1.getDataRange();
  var values = range.getValues();
  const cell = e.range;
  const column = cell.getColumn();
  const row = cell.getRow();
  const lastRow1 = sheet1.getLastRow();
  const lastCol1 = sheet1.getLastColumn();
  const lastRow2 = sheet2.getLastRow();
  const lastCol2 = sheet2.getLastColumn();
  var destValues = [];
  if (column === 1 && e.value === "TRUE") {
    destValues=sheet1.getRange(row, 1, 1, lastCol1).getValues();
    sheet2.getRange(lastRow2+1,1, 1, lastCol1).setValues(destValues);
  }
}

こちらを調整してみます。

列内の空白のセルを探す

まずは、今回の場合はB列の状態を見て末尾を判断したいので、getLastRow()がそのまま使用できません。getLastRow()を使ってそのまま書き込みをしまうと、自動的に末尾行を見つけてしまうので、最下部に追加されてしまいます。

末尾の行にデータが入ってしまいます。

そこで、別の列を見てみます。

この「B列を上から順番に確認していき一番最初の空白セルにデータを書き込む」といったプログラムを作ってみます。

列内の最初の空白セルの行番号を返す

こちらは以前作成した「列内の最初の空白セルの行番号を返す」関数です。こちらを使って、列内の最初の空白セルの行番号を取得します。

function findFirstEmptyCellInColumn() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Sheet2");
  const lastRow = sheet.getLastRow();
  const colValue = sheet.getRange(1,3,lastRow,1).getValues();
  Logger.log("colValue:" + colValue);

for (let i = 0; i < colValue.length; i++) {
    if (colValue[i] == "") {
      return i+1;
    }
  }
}

情報	colValue:設置ID,1,2,14,12,3,,,,,,,,,,,,,,,,,,,,

配列の番号が0から始まるので、+1してreturnしています。

関数の返り値を取得して行番号にセットする

ここまでくれば、あとは関数の返り値を取得して行番号にセットすることで、空白セルの行から順番に値を書き込んでいくことができます。

function copyData(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName('Sheet1'); // チェックボックスがあるシート名
  var sheet2 = ss.getSheetByName('Sheet2'); // コピー先のシート名
  var range = sheet1.getDataRange();
  var values = range.getValues();
  const cell = e.range;
  const column = cell.getColumn();
  const row = cell.getRow();
  const lastRow1 = sheet1.getLastRow();
  const lastCol1 = sheet1.getLastColumn();
  const lastRow2 = sheet2.getLastRow();
  const lastCol2 = sheet2.getLastColumn();
  var destValues = [];
  if (column === 1 && e.value === "TRUE") {
    destValues = sheet1.getRange(row, 2, 1, lastCol1).getValues();
    sheet2.getRange(findFirstEmptyCellInColumn(), 2, 1, lastCol1).setValues(destValues);
  }
}

  function findFirstEmptyCellInColumn() {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = ss.getSheetByName("Sheet2");
    const lastRow = sheet.getLastRow();
    const colValue = sheet.getRange(1, 3, lastRow, 1).getValues();
    Logger.log("colValue:" + colValue);

    for (let i = 0; i < colValue.length; i++) {
      Logger.log("colValue[i]:" + colValue[i]);
      if (colValue[i] == "") {
        return i+1;
      }
    }
  }

チェックを入れます。

別のシートにデータが書き込まれました!

まとめ

GoogleAppsScript(GAS)を活用することで、作業の自動化や生産性の向上が期待できます。ぜひGASを使った便利なツールの開発に挑戦してみましょう。

会員登録するとご利用できます。
Kindle Unlimited 会員は無料で購読できます
購読はこちら
Kindle Unlimited 会員は無料で購読できます
購読はこちら