(googleスプレッドシート)連続コピー(関数 or セル値)

連続コピー(関数コピー・セル(値)コピー)は、エクセルと同様に、選択したセルの右下にカーソルを当て、ダブルクリックすると、隣接するセルの最老番の行まで実行されます。
ただし、隣接するセルがない場合や、隣接するセルが空欄の箇所があるために、途中でストップすることがあるので、コピーのスクリプトを載せておくのは賢明かもしれません。

スプレッドシートの「拡張機能」→「Apps script」→ファイルの右横の「+」→「スクリプト」を選択して、以下のコードを貼り付け、保存します。

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('連続コピー')
    .addItem('関数コピー', 'fillWithFormula')
    .addItem('セルコピー', 'copyCellValue3')
    .addToUi();
}

同様に、これも。

function fillWithFormula() {
  // アクティブなシートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // セルを選択するようにユーザーに促すメッセージを表示
  var startCellAddress = Browser.inputBox('関数をコピーするセルを入力してください(例: C4)');
  
  // セルが選択されなかった場合、処理を中止
  if (startCellAddress == 'cancel') {
    return;
  }
  
  // 選択されたセルの範囲を取得
  var startCell = sheet.getRange(startCellAddress);
  
  // 選択されたセルに関数があるか確認
  if (!startCell.getFormula()) {
    Browser.msgBox('選択されたセルには関数がありません。');
    return;
  }
  
  // コピーする行の範囲を指定するためのメッセージを表示
  var endRow = Browser.inputBox('どの行まで関数をコピーしますか?(行番号を入力してください)');
  
  // ユーザーがキャンセルを押した場合、処理を中止
  if (endRow == 'cancel' || isNaN(endRow) || endRow < startCell.getRow()) {
    Browser.msgBox('正しい行番号を入力してください。');
    return;
  }

  // 関数をコピーする範囲を指定
  var formula = startCell.getFormula();
  var range = sheet.getRange(startCell.getRow(), startCell.getColumn(), endRow - startCell.getRow() + 1);
  
  // 指定範囲に関数を設定
  range.setFormula(formula);
  
  // 完了メッセージを表示
  Browser.msgBox('関数のコピーが完了しました。');
}

これも、同様に。

function copyCellValue3() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // コピー元の範囲を選択するようにユーザーに促すメッセージを表示
  var startRangeAddress = Browser.inputBox('コピー元の範囲を選択してください(例: C1:C3)');
  
  // 範囲が選択されなかった場合、処理を中止
  if (startRangeAddress == 'cancel') {
    return;
  }
  
  // コピー元の範囲を取得
  var startRange = sheet.getRange(startRangeAddress);
  var values = startRange.getValues();
  
  // コピーする行の範囲を指定するためのメッセージを表示
  var endRow = Browser.inputBox('どこまでコピーしますか?(行番号を入力してください)');
  
  // ユーザーがキャンセルを押した場合、処理を中止
  if (endRow == 'cancel' || isNaN(endRow) || endRow < startRange.getLastRow()) {
    Browser.msgBox('正しい行番号を入力してください。');
    return;
  }

  // コピー先の範囲を指定
  var startRow = startRange.getRow();
  var startColumn = startRange.getColumn();
  var numRows = endRow - startRow + 1;
  var numCols = startRange.getNumColumns();
  var outputValues = [];
  
  // 単一のセルの値の場合
  if (values.length === 1) {
    var singleValue = values[0][0];
    
    // 数値のパターンを検出
    if (!isNaN(singleValue)) {
      for (var i = 0; i < numRows; i++) {
        outputValues.push([singleValue]);
      }
    } else {
      // 曜日などの文字列パターンを繰り返す
      for (var i = 0; i < numRows; i++) {
        outputValues.push([singleValue]);
      }
    }
  } else {
    // 数値のパターンを解析
    var isNumeric = values.every(row => !isNaN(row[0]));
    if (isNumeric) {
      // 数値の増減分を計算
      if (values.length > 1) {
        var step = values[1][0] - values[0][0];
        if (step === 1) {
          // 増減が+1の場合
          for (var i = 0; i < numRows; i++) {
            outputValues.push([values[0][0] + i]);
          }
        } else {
          // パターンを繰り返す
          for (var i = 0; i < numRows; i++) {
            var patternIndex = i % values.length;
            outputValues.push(values[patternIndex]);
          }
        }
      } else {
        // 単一の数値が選択された場合
        for (var i = 0; i < numRows; i++) {
          outputValues.push([values[0][0]]);
        }
      }
    } else {
      // 曜日パターンを検出し、周期的に繰り返す
      var isDayPattern = values.every(row => ['月', '火', '水', '木', '金', '土', '日'].includes(row[0]));
      if (isDayPattern) {
        var daysOfWeek = ['月', '火', '水', '木', '金', '土', '日'];
        for (var i = 0; i < numRows; i++) {
          outputValues.push([daysOfWeek[i % daysOfWeek.length]]);
        }
      } else {
        // その他のパターンを繰り返す
        for (var i = 0; i < numRows; i++) {
          var patternIndex = i % values.length;
          outputValues.push(values[patternIndex]);
        }
      }
    }
  }
  
  // コピー先の範囲に値を設定
  var range = sheet.getRange(startRow, startColumn, numRows, numCols);
  range.setValues(outputValues);
  
  // 完了メッセージを表示
  Browser.msgBox('セルのコピーが完了しました。');
}

保存が終わったら、OnOpenの実行ボタンをおせば、スプレッドシートに「連続コピー」の文字がでると思います。

以上
#GAS
#GoogleSpreadSheet

サポートをお願いします! 漢検準1級の参考書を買いたいです。