Repository navigation
Expand file tree
/
Copy pathCode.gs
More file actions
236 lines (197 loc) · 7.4 KB
/
Copy pathCode.gs
File metadata and controls
236 lines (197 loc) · 7.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
/**
* 並び替えカスタムメニュー - Google Apps Script
* スプレッドシート「実験」シート用の並び替え機能
*
* プロジェクトID: 1vGzJH1nT_eJHCjukpo6Zzez4gMr6VYDa3C-pIDtM0KKOSNSJp0NNZVBd
*
* 実装手順:
* 1. このコード全体をコピー
* 2. Apps Scriptエディタでデフォルトコードを削除
* 3. このコードを貼り付け
* 4. Ctrl+S で保存
* 5. onOpen 関数を手動実行(初回のみ)
* 6. スプレッドシートを再読み込み
*/
/**
* スプレッドシートが開かれた時に実行される関数
* カスタムメニューを追加
*/
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('🔄 並び替え')
.addItem('📝 名前順', 'sortByName')
.addItem('📅 生年月日順', 'sortByBirthDate')
.addSeparator()
.addItem('↩️ 元の順序に戻す', 'resetToOriginalOrder')
.addItem('📊 データ統計', 'showDataStats')
.addToUi();
}
/**
* 名前順(ふりがな順)で並び替えする関数
*/
function sortByName() {
const sheet = SpreadsheetApp.getActiveSheet();
// シート名が「実験」かどうかチェック
if (sheet.getName() !== '実験') {
SpreadsheetApp.getUi().alert('「実験」シートを選択してください。');
return;
}
try {
// データ範囲を取得(見出し行A1:D1を除く)
const dataRange = sheet.getRange('A2:D41');
const data = dataRange.getValues();
// データが存在するかチェック
const validData = data.filter(row => row[1] && row[2]); // 氏名とふりがながあるもの
if (validData.length === 0) {
SpreadsheetApp.getUi().alert('並び替えるデータがありません。');
return;
}
// ふりがな(C列、インデックス2)で並び替え
data.sort((a, b) => {
// ふりがなが空の場合の処理
const nameA = a[2] || '';
const nameB = b[2] || '';
return nameA.localeCompare(nameB, 'ja');
});
// 番号を再割り当て(1から開始)
for (let i = 0; i < data.length; i++) {
data[i][0] = i + 1;
}
// 並び替えたデータを書き戻し
dataRange.setValues(data);
// 完了メッセージ
SpreadsheetApp.getUi().alert(
'✅ 名前順(ふりがな順)で並び替えが完了しました。\\n' +
'📝 ' + validData.length + '件のデータが並び替えられました。'
);
} catch (error) {
SpreadsheetApp.getUi().alert(
'❌ エラーが発生しました:\\n' + error.toString()
);
console.error('sortByName エラー:', error);
}
}
/**
* 生年月日順で並び替えする関数
*/
function sortByBirthDate() {
const sheet = SpreadsheetApp.getActiveSheet();
// シート名が「実験」かどうかチェック
if (sheet.getName() !== '実験') {
SpreadsheetApp.getUi().alert('「実験」シートを選択してください。');
return;
}
try {
// データ範囲を取得(見出し行A1:D1を除く)
const dataRange = sheet.getRange('A2:D41');
const data = dataRange.getValues();
// データが存在するかチェック
const validData = data.filter(row => row[1] && row[3]); // 氏名と生年月日があるもの
if (validData.length === 0) {
SpreadsheetApp.getUi().alert('並び替えるデータがありません。');
return;
}
// 生年月日(D列、インデックス3)で並び替え
data.sort((a, b) => {
// 日付文字列をDateオブジェクトに変換して比較
let dateA, dateB;
try {
// 日付の形式を統一(YYYY/M/D → YYYY/MM/DD)
const dateStrA = a[3] ? a[3].toString() : '';
const dateStrB = b[3] ? b[3].toString() : '';
dateA = new Date(dateStrA);
dateB = new Date(dateStrB);
// 無効な日付の場合は最後に移動
if (isNaN(dateA.getTime())) dateA = new Date('9999/12/31');
if (isNaN(dateB.getTime())) dateB = new Date('9999/12/31');
} catch (e) {
// エラーが発生した場合は文字列として比較
return a[3].toString().localeCompare(b[3].toString());
}
return dateA - dateB;
});
// 番号を再割り当て(1から開始)
for (let i = 0; i < data.length; i++) {
data[i][0] = i + 1;
}
// 並び替えたデータを書き戻し
dataRange.setValues(data);
// 完了メッセージ
SpreadsheetApp.getUi().alert(
'✅ 生年月日順で並び替えが完了しました。\\n' +
'📅 ' + validData.length + '件のデータが並び替えられました。'
);
} catch (error) {
SpreadsheetApp.getUi().alert(
'❌ エラーが発生しました:\\n' + error.toString()
);
console.error('sortByBirthDate エラー:', error);
}
}
/**
* 元の順序(ふりがな順)に戻す関数
*/
function resetToOriginalOrder() {
const sheet = SpreadsheetApp.getActiveSheet();
if (sheet.getName() !== '実験') {
SpreadsheetApp.getUi().alert('「実験」シートを選択してください。');
return;
}
const ui = SpreadsheetApp.getUi();
const response = ui.alert(
'確認',
'元の順序(ふりがな順)に戻しますか?',
ui.ButtonSet.YES_NO
);
if (response === ui.Button.YES) {
sortByName(); // ふりがな順に戻す
}
}
/**
* データの統計情報を取得する関数
*/
function showDataStats() {
const sheet = SpreadsheetApp.getActiveSheet();
if (sheet.getName() !== '実験') {
SpreadsheetApp.getUi().alert('「実験」シートを選択してください。');
return;
}
try {
const dataRange = sheet.getRange('A2:D41');
const data = dataRange.getValues();
// 空行を除いた実際のデータ数
const actualData = data.filter(row => row[1] && row[2]); // 氏名とふりがながあるもの
// 生年月日の範囲を取得
const birthDates = actualData
.map(row => row[3])
.filter(date => date)
.map(date => new Date(date))
.filter(date => !isNaN(date.getTime()))
.sort((a, b) => a - b);
const oldestDate = birthDates[0];
const newestDate = birthDates[birthDates.length - 1];
const stats =
'📊 データ統計情報\\n' +
'━━━━━━━━━━━━━━━━━━━━\\n' +
'👥 総データ数: ' + actualData.length + '件\\n' +
'📅 最も古い生年月日: ' + (oldestDate ? formatDate(oldestDate) : '不明') + '\\n' +
'📅 最も新しい生年月日: ' + (newestDate ? formatDate(newestDate) : '不明') + '\\n' +
'🎂 生年月日データ数: ' + birthDates.length + '件';
SpreadsheetApp.getUi().alert(stats);
} catch (error) {
SpreadsheetApp.getUi().alert('統計情報の取得でエラーが発生しました: ' + error.toString());
}
}
/**
* 日付をフォーマットする補助関数
*/
function formatDate(date) {
return date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate();
}
/**
* 手動でメニューを追加する関数(初回セットアップ用)
*/
function setupMenu() {
onOpen();
SpreadsheetApp.getUi().alert('📋 並び替えメニューが追加されました!\\n\\nメニューバーの「🔄 並び替え」から使用できます。');
}