回答編集履歴

3

追加

2022/12/28 12:27

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -28,3 +28,71 @@
28
28
  - 参考:[GASの日付を文字列フォーマットに変換する方法(formatDateメソッド) | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門](https://auto-worker.com/blog/?p=1114)
29
29
  - または、GASを使用せずに、Googleスプレッドシートの「カスタム日時」で表示形式を変更することも可能です。
30
30
  - 参考:[スプレッドシートで数値の表示形式を設定する - パソコン - Google ドキュメント エディタ ヘルプ](https://support.google.com/docs/answer/56470?hl=ja&co=GENIE.Platform%3DDesktop#zippy=)
31
+
32
+ ---
33
+
34
+ ### 最終更新日時のみ書き込むコード
35
+ > Aシート、Bシート・・・Zシートの最終更新日を「更新管理」シートに記載することは可能でしょうか。
36
+ > イメージとしては、新しいレコードが追加されのではなく、
37
+ > Aシート:12/27
38
+ > 更新があったら、上記のレコードの更新日が上書きされて以下のようになる形です。
39
+ > Aシート:12/28
40
+
41
+ ##### STEP1
42
+ 初回のみ、以下の`writeSheetNames()`関数を実行すると、自動でシート名を羅列してくれます。
43
+
44
+ ▼実行前
45
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-28/926cc90e-4741-4e5f-996c-3e5cff01a484.png)
46
+
47
+ ▼実行後
48
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-28/6f800a80-66f7-4583-8310-e006d6e6b071.png)
49
+
50
+ ```javascript
51
+ // 『最終更新日管理シート』に、自動でシート名(A〜Zシート)を出力する、初回のみ手動で実行させる関数
52
+ function writeSheetNames() {
53
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
54
+ const lastDateSheet = ss.getSheetByName('最終更新日管理');
55
+
56
+ // シート名を配列で取得(例:最初の2つのシートは無視して、3つ目=配列で言うと2番目からが対象シート)
57
+ const sheetNames = ss.getSheets().slice(2).map(sheet => sheet.getSheetName()); // ['Aシート', 'Bシート', 'Zシート']
58
+ // 書き込む情報の2次元配列を生成
59
+ const values = sheetNames.map(name => [name, '']);
60
+ // [
61
+ // ['Aシート', ''],
62
+ // ['Bシート', ''],
63
+ // ['Zシート', '']
64
+ // ]
65
+
66
+ // 書き込む場所の範囲を取得
67
+ const range = lastDateSheet.getRange(2, 1, sheetNames.length, 2);
68
+ // シート名を書き込む
69
+ range.setValues(values);
70
+ }
71
+ ```
72
+
73
+ ##### STEP2
74
+ 以下の`writeLastEditDate(e)`関数を「編集時」トリガーに設定してください。
75
+ 最終更新日時のみ管理できるようになります。
76
+
77
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-28/301f429a-b2b6-414a-9960-fe531e3807c3.png)
78
+
79
+ ```javascript
80
+ // 『最終更新日管理シート』に、編集があったシートの最終更新日を、編集時に自動で出力する関数
81
+ function writeLastEditDate(e) {
82
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
83
+ const lastDateSheet = ss.getSheetByName('最終更新日管理');
84
+ const lastRow = lastDateSheet.getLastRow();
85
+
86
+ // 編集されたシート名を取得
87
+ const sheetName = e.source.getSheetName();
88
+ // 編集日時を整形
89
+ const now = Utilities.formatDate(new Date(), 'JST', "yyyy/MM/dd HH:mm:ss");
90
+
91
+ // 編集されたシート名が、最終更新日管理シートの何行目にあるか、行番号を取得
92
+ const rowNum = lastDateSheet.getRange(1, 1, lastRow, 1).getValues().flat().indexOf(sheetName) + 1;
93
+ // 書き込むセルを取得
94
+ const cell = lastDateSheet.getRange(rowNum, 2);
95
+ // 更新日時を書き込む
96
+ cell.setValue(now);
97
+ }
98
+ ```

2

誤字修正、日時整形追記

2022/12/27 17:10

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -24,5 +24,7 @@
24
24
  - トリガーで編集時(または`onEdit(e)`)に設定すると、引数`e`(イベントオブジェクト)からさまざまな編集情報が取得できます。
25
25
  - 参考:[【GAS】onEditの使い方、onedit(e) とは?【コピペで使えるサンプルコード】 | スプレッドシートでGASる](https://coporilife.com/508/)
26
26
  - 私はスプレッドシートの言語設定が英語のため日時が「12/28/2022」になってしまっていますが、日本語に設定されていましたらデフォルトで年月日の順番で表示されていると思います。
27
- - されていない場合や他の表示に変更したい場合は、`Utilities.dateFormat()`メソッドを利用して、お好きに整形してください。
27
+ - されていない場合や他の表示に変更したい場合は、`Utilities.formatDate()`メソッドを利用して、お好きに整形してください。
28
- - 参考:[GASの日付を文字列フォーマットに変換する方法(formatDateメソッド) | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門](https://auto-worker.com/blog/?p=1114)
28
+ - 参考:[GASの日付を文字列フォーマットに変換する方法(formatDateメソッド) | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門](https://auto-worker.com/blog/?p=1114)
29
+ - または、GASを使用せずに、Googleスプレッドシートの「カスタム日時」で表示形式を変更することも可能です。
30
+ - 参考:[スプレッドシートで数値の表示形式を設定する - パソコン - Google ドキュメント エディタ ヘルプ](https://support.google.com/docs/answer/56470?hl=ja&co=GENIE.Platform%3DDesktop#zippy=)

1

setValues() --> appendRow()

2022/12/27 17:06

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -15,11 +15,8 @@
15
15
 
16
16
  const ss = SpreadsheetApp.getActiveSpreadsheet();
17
17
  const sheet = ss.getSheetByName('更新管理'); // 更新情報を記録するシートを取得
18
- const lastRow = sheet.getLastRow();
19
- const lastCol = sheet.getLastColumn();
20
- const range = sheet.getRange(lastRow + 1, 1, 1, lastCol); // 最終行の次の行(新規行)〜最終列を取得
21
18
 
22
- range.setValues([[now, sheetName, cellName, oldValue, newValue]]); // 情報を書き込む
19
+ sheet.appendRow([now, sheetName, cellName, oldValue, newValue]); // 最終行に行を追加し、情報を書き込む
23
20
  }
24
21
  ```
25
22