【GAS】チェックしたセルを変身させる方法
今回の内容
・チェックすると、そのセルに時間を入れるGASのコードを書いた。
・コードの紹介、応用と使用例の紹介。
・ChatGPT(3.5)を使って書いたので、プロンプトの紹介。
はじめに
私は本職のプログラマでは無いので「コードの良し悪し」について判断できません、見る人からしたら違和感のある記述もあるかもしれませんがご了承ください。
「動けばええやろ」の精神です。
コードの説明
・実際の挙動
挙動に関しては、画像の通りです。
チェックボックスにチェックを入れると「今の時間」を自動で入力してくれます。
・使用するコード
// 初期設定
const sName = "test"; // シート名。
const sRanges = ["A:B", "C:C"]; // 範囲指定。
const Format = "hh:mm:ss"; // 書式設定。
function onEdit(e) {
const eSheetName = e.source.getSheetName();
if (eSheetName === sName) {
for (const range of sRanges) {
TimeStamp(e.source.getSheetByName(sName), range);
}
}
}
function TimeStamp(sheet, range) {
const Time = new Date();
const sRange = sheet.getRange(range);
const Data = sRange.getValues();
//「Data」配列内で「TRUE」のセルを「Time」の値に書換える。
Data.forEach((row, i) => {
row.forEach((cellValue, j) => {
if (cellValue === true) {
const cell = sRange.getCell(i + 1, j + 1);
cell
.clearDataValidations()
.setValue(Time)
.setNumberFormat(Format);
}
});
});
}
①シート名
実行したいシートの「シート名」を入力してください。
※シートの指定は必ず1枚にして下さい。(「"test01 , test02"」と指定すれば複数指定可能ですがオススメはしません)
②範囲指定
セル範囲を指定してください。
関数で範囲を指定する要領で範囲を指定できます。
③書式設定
省略可能です。
「時間(シリアル値)」を扱う際は、必須になります。
④入力する値
コード中盤の「Time」の中身を弄ってください。
時間だけでなく、好きな文字列や、数式や別セルの参照など、色々と応用や拡張も可能です。
活用例
・Case.1:進捗管理表
「タスク」と書きましたが、議事録作成のメモや、勉強の目標など、色々と応用は利くと思います。
・Case.2:戦績管理ツール
私が実際に使用しているシートの例です。
対人ゲームの戦績を管理しています。
指定した期間内の勝率を振り返ったり、
相手キャラの分布に関して、時間帯によって変化する事を実感できて楽しいです。
車輪の再発明
・便利なショートカットを活用しよう!
既にお気付きの方もいるかと思いますが、
正直なところ「Ctrl +Shift + :」「Ctrl +Shift +Alt + :」のショートカットで事足りる内容です。
「文字列に変身」させたい場合や、「共有シートでフォーマットを固定」させたい場合など、使用用途としては少し限定的になるかもしれません。
・コード作成の経緯
元々の作成経緯として「キーボード操作をしたくない」「マウス操作で完結させたい」という考えがあります。(Case.2のシートのように)
この需要があるかはわかりませんが、別の動作に集中出来たり、ワンクリックで操作が済むなど、使用感はとても良いです。
コードについては以上になります。
以降は「ChatGPTでプログラミングする方法」になります。
いかにして先のコードを作成したか、お見せします。
後編:ChatGPTでプログラミングする方法
・前提条件
バージョン : GPT-3.5(無料のやつ)
実行日 : 2023年9月末
前提知識 : 何もいらない。
※プログラミングの基礎の基礎知識はあったほうが良いかも。(youtubeの動画1本みる程度)
・プロンプトの例
①こんなコード作って!
②ここ修正して!追加して!
基本的にはこの2つの繰り返しです。
実際の会話内容
・STEP.01
まずはメイン処理部分を作成。
「チェックセル(TRUE)を時間に書き換えてくれ」と要望。
function updateCheckedCells() {
var sheetName = "test"; // シート名
var range = "A:A"; // 適応範囲
// スプレッドシートを開く
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName(sheetName);
var data = sheet.getRange(range).getValues();
// 現在の時間を取得
var currentTime = new Date();
// チェックボックスがTRUEのセルに時間を入力
for (var i = 0; i < data.length; i++) {
if (data[i][0] === true) {
sheet.getRange(i + 1, 1).setValue(currentTime);
}
}
}
コードを実行してみると…。
時間は入力されたものの、警告文が表示されました。
「入力規則に違反している」とあります。
チェックボックスは「入力規則」なので、この設定が残っているのでしょう。
・STEP.02
入力規則を消すように要望を出します。
function updateCheckedCells() {
var sheetName = "test"; // シート名
var range = "A:A"; // 適応範囲
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var data = sheet.getRange(range).getValues();
var currentTime = new Date();
data.forEach(function(row, index) {
if (row[0] === true) {
var cell = sheet.getRange(index + 1, 1);
cell.clearContent();
var rule = cell.getDataValidation();
if (rule != null) {
cell.clearDataValidations(); // 入力規則をクリア
}
cell.setValue(currentTime); // 現在の時間を入力
}
});
}
警告文が消えました、うまく行ったようです。
・STEP.03
次は表示形式。
時間のみを表示したいのですが、
表示形式を設定しても、コードを起動するたび更新されてしまいます。
こちらもコード内で制御する必要があるようです。
「時間入力後、指定した範囲全てに同じ書式設定をするように」と要望を出します。
function updateCheckedCells() {
var sheetName = "test"; // シート名
var range = "A:A"; // 適応範囲
var format = "hh:mm:ss"; // 書式設定
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var rangeToApplyFormat = sheet.getRange(range);
var data = rangeToApplyFormat.getValues();
var currentTime = new Date();
data.forEach(function(row, index) {
if (row[0] === true) {
var cell = rangeToApplyFormat.getCell(index + 1, 1);
cell.clear({contentsOnly: true, validations: true});
cell.setValue(currentTime);
}
});
rangeToApplyFormat.setNumberFormat(format); // 指定された書式を設定
}
これでメイン処理部分は完成です。
次は「チェックしたらこのコードを起動させる」コードを書きます。
・STEP.04
貰ったコードをちょっと弄って質問文を作ります。
※ここは少しプログラミングの知識が必要になるかもしれません。
var sheetName = "test"; // シート名
var range = "A:A"; // セル範囲
function onEdit(e) {
var editedSheet = e.source.getSheetName();
if (editedSheet === sheetName) {
updateCheckedCells();
}
}
function updateCheckedCells() {
//省略
}
・STEP.05
「STEP.03」と「STEP.04」のコードを合体させましょう。
ただ単純に2つのコードをコピペして質問するだけでOKです。
ただ、どうしてもアバウトな質問になるので、再生成を連打しても上手くいかない可能性があります。
これは自分で修正箇所を探して2つのコードを連結させるのが確実です。
提示されたコードを少し弄ったコード
var sheetName = "test"; // シート名
var range = "A:A"; // 適応範囲
var format = "hh:mm:ss"; // 書式設定
function onEdit(e) {
var editedSheet = e.source.getSheetName();
if (editedSheet === sheetName) {
updateCheckedCells();
}
}
function updateCheckedCells() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var rangeToApplyFormat = sheet.getRange(range);
var data = rangeToApplyFormat.getValues();
var currentTime = new Date();
data.forEach(function(row, index) {
if (row[0] === true) {
var cell = rangeToApplyFormat.getCell(index + 1, 1);
cell.clear({contentsOnly: true, validations: true});
cell.setValue(currentTime);
}
});
rangeToApplyFormat.setNumberFormat(format); // 指定された書式を設定
}
コードの大枠はこれで完成になります。
・この先の流れ
後は細かい修正になります。
こちらも同じ要領で「質問」と「修正」を繰り返しになります。
ときには全てを捨てて「STEP1」からやり直した方が早い場合もあります。
臆せずに最初の要件から見直すことも大切です。
今回の内容は以上になります、お疲れさまでした。
こんな記事ですが一読してくださり、ありがとうございました。
それでは。
この記事が気に入ったらサポートをしてみませんか?