(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の実行ボタンをおせば、スプレッドシートに「連続コピー」の文字がでると思います。
いいなと思ったら応援しよう!
