かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Google Apps Script 俺がスプレットシートの値を変更した時に特定のセルの値によって異なるシートに行(row)をまるっとコピーしたいんだが。

ちょっと前に流行ったラノベみたいなタイトルになってしまったが後悔はしていない。
例えば数箇所で行うイベントの予約をGoogleDriveのフォームで取っていたとして、予約のリストが回答というスプレットシートに反映されます。で、入金を確認した時にシートにチェックを入れたら自動的に予約者のデータがある行(ROW)を各イベントのシートにコピーしたいけど、手動コピーはミスが出るからやりたくないね―と思いスクリプトを書いてみました。
需要あるのかどうか極めて謎な超範囲が狭いスクリプトです。。。

シート例

シート名: 回答

timestamp Name Event is_payment
1917/11/8 れーにん Tokyo 0
1922/4/3 よしふ Osaka 0
1953/9/7 にきーた Osaka 0
1964/10/14 ぶれじねふ Moscow 0
1982/11/12 あんどろぽふ Tokyo 0
1984/2/13 ちぇるねんこ Tokyo 0
1985/3/11 ごるびぃ Moscow 0

支払いがあった時にis_payment1にします。
その時にEvent行の内容別で対象のシートにその列をコピーします。
イベントをコピーする対象のシート名東京大阪モスクワ
※予めシートを作成しておく必要があります  

Google Apps Script

// シート名を指定してrangeのデータをコピーする関数
function copyRowData(sheetName, range) {
  // コピーするシート名
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var row = sheet.getLastRow();
  // コピーするシートの先頭にidをつける
  var id = 'ID: ' + ('00' + row).slice(-3);
  row+=1;
  sheet.getRange(row, 1).setValue( id );
  // rangeのデータをコピーする
  range.copyTo( sheet.getRange(row, 2) );
}

// onEdit Event
function onEditEvent(evt) {
  // 編集のあったシート
  var ss = evt.source.getActiveSheet();
  //編集したセル
  var cell = evt.source.getActiveRange();

  // シート名が「回答」 かつ 編集のあったセル番号が4番目 かつ セルの値が「1」の時
  // getValue() の値が0と入力しても数値と文字列どちらで取れるか曖昧なので、あえて == にしています
  if(ss.getName() === '回答' && cell.getColumn() == 4 && cell.getValue() == 1) {
    // 編集があったセルのある行番号
    var r = cell.getRow(); 
    var rowRange = ss.getRange(r, 1, 1, ss.getMaxColumns());
    // eventのセルは3番目
    var eventVal = rowRange.getCell(1, 3).getValue();
    if(eventVal === 'Tokyo') {
      // シート名「東京」に行をコピー
      copyRowData('東京', rowRange);
    } else if(eventVal === 'Osaka') {
      // シート名「大阪」に行をコピー
      copyRowData('大阪', rowRange);
    } else if(eventVal === 'Moscow') {
      // シート名「モスクワ」に行をコピー
      copyRowData('モスクワ', rowRange);
    }
  }
}
  1. メニュー リソースから現在のプロジェクトのトリガーを選択
  2. 実行をonEditEventに変更
  3. イベントをスプレットシートからに変更
  4. 隣のアクションを編集時に変更
  5. 保存 ボタンを押してイベントをトリガーする

これで、回答のシートのis_paymentセルを1に変更すると、対象のシートにその行がコピーできるようになりました!

[参考]

冴えない彼女の育てかた キャラクターイメージソング 澤村・スペンサー・英梨々

冴えない彼女の育てかた キャラクターイメージソング 澤村・スペンサー・英梨々