12.08
とあるChatGPTが開発した仕事
以下は、とある会社のとある仕事で作成したGoogleスプレッドシート用のスクリプトです。そのスクリプトはChatGPT4で開発しました。1時間程度やり取りして完成。その後、簡単な概要説明と詳細設計書も作ってもらった。この程度の長さのスクリプトであれば十分であろう。ついでのついでに変数の説明書も作ってもらった。
僕にとっては、プログラム開発、プログラムの文書かももう少し立てば、自己開発、外部発注は無くなる、かもしれない。

概要設計書
目的:スクリプトは、指定された年月に基づいてGoogleスプレッドシート内に新しいシートを作成し、それらに日付と曜日の情報を記入し、既存の「MM00」シートから特定のデータをコピーすることを目的としています。
機能概要:
- 月間シートの作成:指定された年月の各日付に対応するシートを作成します。
- 日付と曜日の記入:各シートに現在の日付と曜日を記入します。
- データのコピー:「MM00」形式のシートから特定の曜日に関連するデータを新しいシートにコピーします。
- シートのソート:作成されたシートを日付順にソートします。
詳細設計書
1. 月間シートの作成 (createMonthlySheets
関数)
- スプレッドシートの名前から年月を抽出し、その月の日数を計算します。
- その月の各日付に対応するシートを作成します。
- 既に同じ名前のシートが存在する場合は新しいシートを作成しません。
2. 日付と曜日の記入
- 新しいシートのA1セルには「YYYY年MM月DD日」の形式で日付を設定します。
- A2セルには日本語のロング曜日(例:「月曜日」)を設定します。
- A1とB1、A2とB2を結合し、フォントをArial、サイズ12ポイント、太文字、右寄せに設定します。
3. データのコピー (copyDataFromSourceSheet
関数)
- 「MM00」形式のシートを特定し、そこから特定の曜日に関連するデータを検索します。
- 各セルからM列までのデータを新しいシートの指定された位置にコピーします。
- 結合されたセルの行数を考慮し、コピーする範囲を調整します。
- コピーしたデータには上側の罫線を設定し、次のペースト位置を1行空けるようにします。
4. シートのソート (sortSheetsByDate
関数)
- 作成された全てのシートを名前(日付)順にソートします。
- シートの順序を調整して、日付順に並べ替えます。
変数一覧と説明
- spreadsheet:
- 型:
Spreadsheet
- 説明: 現在アクティブなGoogleスプレッドシートを参照するオブジェクト。
- spreadsheetName:
- 型:
String
- 説明: 現在アクティブなスプレッドシートの名前。
- yearMonth:
- 型:
String
- 説明: スプレッドシート名から「送迎表 」を除いた後の文字列。年月を表す。
- year:
- 型:
String
- 説明:
yearMonth
から抽出した年を表す。
- month:
- 型:
String
- 説明:
yearMonth
から抽出した月を表す。
- daysInMonth:
- 型:
Number
- 説明: 指定された月の日数。
- newSheetName:
- 型:
String
- 説明: 新しく作成するシートの名前。日付「MMdd」形式。
- newSheet:
- 型:
Sheet
- 説明: 新しく作成されたシートのオブジェクト。
- date:
- 型:
Date
- 説明: 各シートに設定される日付。
- longWeekday:
- 型:
Array<String>
- 説明: 日本語の曜日(長い形式)の配列。
- 型:
- longWeekdayValue:
- 型:
String
- 説明: 特定の日付に対応する曜日の文字列。
- 型:
- sourceSheetName:
- 型:
String
- 説明: データをコピーする元となるシートの名前。「MM00」形式。
- 型:
- sourceSheet:
- 型:
Sheet
- 説明: データをコピーする元となるシートのオブジェクト。
- 型:
- shortWeekday:
- 型:
Array<String>
- 説明: 日本語の曜日(短い形式)の配列。
- 型:
- shortWeekdayValue:
- 型:
String
- 説明: 特定の日付に対応する曜日の短い形式の文字列。
- 型:
- lastRow:
- 型:
Number
- 説明:
sourceSheet
の最後の行の行番号。
- 型:
- foundRows:
- 型:
Array<Object>
- 説明: 特定の曜日に一致する行とその行数を保持するオブジェクトの配列。
- 型:
- values:
- 型:
Array<Array<String>>
- 説明:
sourceSheet
のA列の値の配列。
- 型:
- mergers:
- 型:
Array<Range>
- 説明:
sourceSheet
のA列にある結合されたセル範囲の配列。
- 型:
- pasteRow:
- 型:
Number
- 説明: 新しいシートにデータを貼り付ける開始行番号。
- 型:
- sheets:
- 型:
Array<Sheet>
- 説明: スプレッドシート内の全シートの配列。
- 型:
function createMonthlySheets() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var spreadsheetName = spreadsheet.getName();
var yearMonth = spreadsheetName.replace(“送迎表 “, “”);
var year = yearMonth.split(“-“)[0];
var month = yearMonth.split(“-“)[1];
var daysInMonth = new Date(year, month, 0).getDate();
for (var day = 1; day <= daysInMonth; day++) {
var newSheetName = Utilities.formatDate(new Date(year, month – 1, day), spreadsheet.getSpreadsheetTimeZone(), “MMdd”);
if (!spreadsheet.getSheetByName(newSheetName)) {
var newSheet = spreadsheet.insertSheet(newSheetName);
// A1に年月日を設定
var date = new Date(year, month – 1, day);
newSheet.getRange(‘A1’).setValue(date).setNumberFormat(“yyyy年mm月dd日”);
// A2に日本語のロング曜日を設定
var longWeekday = [‘日曜日’, ‘月曜日’, ‘火曜日’, ‘水曜日’, ‘木曜日’, ‘金曜日’, ‘土曜日’];
var longWeekdayValue = longWeekday[date.getDay()];
newSheet.getRange(‘A2’).setValue(longWeekdayValue);
// A1とB1を結合し、フォント設定と右寄せ
newSheet.getRange(‘A1:B1’).merge().setFontFamily(‘Arial’).setFontSize(12).setFontWeight(‘bold’).setHorizontalAlignment(‘right’);
// A2とB2を結合し、フォント設定
newSheet.getRange(‘A2:B2’).merge().setFontFamily(‘Arial’).setFontSize(12).setFontWeight(‘bold’).setHorizontalAlignment(‘right’);;
// 対応する「MM00」シートからデータをコピー
var sourceSheetName = Utilities.formatDate(date, spreadsheet.getSpreadsheetTimeZone(), “MM00”);
var sourceSheet = spreadsheet.getSheetByName(sourceSheetName);
if (sourceSheet) {
// マッチングには短い曜日名を使用
var shortWeekday = [‘日’, ‘月’, ‘火’, ‘水’, ‘木’, ‘金’, ‘土’];
var shortWeekdayValue = shortWeekday[date.getDay()];
copyDataFromSourceSheet(sourceSheet, newSheet, shortWeekdayValue);
}
}
}
sortSheetsByDate(spreadsheet);
}
function copyDataFromSourceSheet(sourceSheet, targetSheet, shortWeekday) {
var lastRow = sourceSheet.getLastRow();
var foundRows = [];
var values = sourceSheet.getRange(“A1:A” + lastRow).getValues();
var mergers = sourceSheet.getRange(“A1:A” + lastRow).getMergedRanges();
// 同じ曜日のセルを見つける
for (var i = 0; i < values.length; i++) {
if (values[i][0] === shortWeekday && foundRows.length < 2) {
var row = i + 1;
var numRows = 1; // デフォルトの行数
// 結合されたセルの行数をチェック
mergers.forEach(function(merge) {
if (merge.getRow() <= row && row <= merge.getLastRow()) {
numRows = merge.getLastRow() – merge.getRow() + 1;
}
});
foundRows.push({row: row, numRows: numRows});
}
}
// マッチした曜日がない場合のチェック
if (foundRows.length === 0) {
return;
}
var pasteRow = 4; // シート「0101」の開始行
// 各セルからM列までのデータをコピー
foundRows.forEach(function(foundRow) {
var range = sourceSheet.getRange(foundRow.row, 1, foundRow.numRows, 13); // A列からM列まで
var targetRange = targetSheet.getRange(pasteRow, 1, foundRow.numRows, 13);
range.copyTo(targetRange, {contentsOnly: false});
// 罫線を手動で設定(上側のみ)
targetRange.setBorder(true, null, null, null, null, null);
pasteRow += foundRow.numRows + 1; // 次のペースト位置を更新(1行空ける)
});
}
function sortSheetsByDate(spreadsheet) {
var sheets = spreadsheet.getSheets();
sheets.sort(function(a, b) {
return a.getName().localeCompare(b.getName());
});
for (var i = 0; i < sheets.length; i++) {
spreadsheet.setActiveSheet(sheets[i]);
spreadsheet.moveActiveSheet(i + 1);
}
}
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。