前回の記事
https://qiita.com/Andhy/items/d7af72d2586606fa9468
で触れたVDMとChatGPTを用いたプログラミングの実践編です。VDMやVDMを用いたコーディングの概要については前回の記事を参照してください。
この記事の特徴
- VDMの文法を一切理解する必要はない
- VDMのコードは書かず、概念だけを用いる。
今回は、Webショップ「VDMランド」の店長さんの悩みを解決します。
VDMランドでは、ECサイトの使用上商品を一括登録するにはCSVファイルをアップロードするため、商品画像をスプレットシートで管理しています。
VDMランドのスプレットシートの一部。
店長へのヒアリングの結果、以下の課題が浮き彫りになりました。
課題
スプレットシートで商品画像の管理をしたいが、商品画像が多すぎて面倒である。
現状スタッフが全て手入力をしている。(これを自動化したい)
仕様
働き
ボタンを押すと商品画像が自動で入力される。
- 前提条件
- 商品IDがC列に定義されていること
- 商品画像のパスは{ドメイン_※1}/{商品ID_※2}/{ファイル名_※3}.jpgであること
- 商品画像は1000以下であること
- 事後条件
- カンマ区切りであること
- 商品画像のパスは全てにおいて画像が存在すること
- 商品画像のパスの最後のパスの番号に1を加えたものは画像が存在しないこと
- 生成された商品画像のパスは、対象商品IDと同じ行であること
処理
画像パス生成関数でファイル名1の存在をパスが存在するか関数を用いて確認する。存在すればファイル名に+1して再度存在確認、存在がなくなるまで繰り返し、存在がなくなればカンマ区切りにしてD列に出力
定義
ドメイン_※1:店舗ECサイトのドメインである(https://hoge.com)
商品ID_※2:任意の文字列である。C列から取得
ファイル名_※3:自然数の連番であること(途中欠番なし)
関数
画像パス生成関数: 第一引数(ドメイン_※1)、第二引数(商品ID_※2)、第三引数(ファイル名_※2)
パスが存在するか:第一関数(パス)
設計
言語
Apps Script
仕様上の以下の処理単位は全てfunctionで定義すし、具体的な関数名は()内に示す
ボタンを押すと商品画像が自動で入力される。(main)
画像パス生成関数(generateImagePath)
パスが存在するか(isPathExists)
コーディング
ChatGPTに
以下の仕様に基づいて、Google Apps Scriptで商品画像パスを自動入力するプログラムを作成してください。
という文言のあとに上記仕様と設計を放り込みます。
生成されたコード
// メイン関数:ボタンを押したときに実行
function main() {
var domain = "https://hoge.com"; // ドメイン
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 現在のシート取得
var lastRow = sheet.getLastRow(); // 最終行を取得(C列の商品IDが定義されている範囲)
// C列の商品IDを1行目から最終行までループ
for (var row = 1; row <= lastRow; row++) {
var productID = sheet.getRange(row, 3).getValue(); // C列(3列目)の商品IDを取得
if (productID) {
var imagePaths = []; // 商品画像パスを格納する配列
var startNumber = 1; // ファイル名の連番(開始は1)
// 画像パスの存在を確認しながら生成
while (isPathExists(generateImagePath(domain, productID, startNumber))) {
imagePaths.push(generateImagePath(domain, productID, startNumber)); // 存在するパスを配列に追加
startNumber++; // 次の連番に進む
}
// 画像パスをカンマ区切りでD列(4列目)に出力
sheet.getRange(row, 4).setValue(imagePaths.join(","));
}
}
}
// 画像パス生成関数
function generateImagePath(domain, productID, fileNumber) {
return domain + "/" + productID + "/" + fileNumber + ".jpg"; // パスの生成
}
// パスが存在するかを確認する関数
function isPathExists(path) {
try {
var response = UrlFetchApp.fetch(path, { muteHttpExceptions: true });
return response.getResponseCode() === 200; // 200なら存在、その他は存在しない
} catch (e) {
return false; // エラーの場合も存在しないとみなす
}
}