ChatGPTを利用したプログラム作成例【GoogleAppsScript 】

# やりたいこと
ECサイトでCSVアップロード機能を利用して商品を管理したいが、商品IDがECサイトで自動で振り当てられる。

CSVアップロード機能を用いて登録済み商品の更新と新規商品の登録を適切に管理するために、現状アップされている商品のCSVを参照して商品名と商品IDの関連付けを行いたい。

登録済みcsv(sheet1)
| 商品ID | 商品名 | 詳細 |
|:-:|:-:|:-:|
|  1 |  お惣菜A | 人気 |

更新するcsv
| 商品ID | 商品名 | 詳細 |
|:-:|:-:|:-:|
|   |  お惣菜A | 大人気 |
|   |  お惣菜B | 人気|
 
これを、

| 商品ID | 商品名 | 詳細 |
|:-:|:-:|:-:|
|   1|  お惣菜A | 大人気 |
|   |  お惣菜B | 人気|

としたい。


## 環境
- Googleスプレットシート
- Apps script

### 入力文1
>Apps scriptで、sheet1という名前のシートのD列に引数の値と完全一致した場合、完全一致した行と同じ行のA列の値を返す関数を作ってください

### GPT
Google Apps Scriptを使って、特定のシートの特定の列の値と完全一致する行の値を取得する関数を作成することは比較的簡単です。以下は、シート名「sheet1」のD列に引数の値が完全一致した場合、その行のA列の値を返す関数です。

``` Javascript
function getValueFromAColumn(targetValue) {
  // シート名「sheet1」を取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
  if (!sheet) {
    throw new Error('シート「sheet1」が見つかりません');
  }

  // D列の値を取得
  var data = sheet.getRange('D:D').getValues();
  
  // D列の値を走査して一致する行を見つける
  for (var i = 0; i < data.length; i++) {
    if (data[i][0] === targetValue) {
      // 一致する行のA列の値を返す
      var valueInAColumn = sheet.getRange('A' + (i + 1)).getValue();
      return valueInAColumn;
    }
  }
  
  // 一致する値が見つからない場合はnullを返す
  return null;
}

```


### 入力文2
>上記の関数をクロージャ機能を使い、適切にメモ化してください


### GPT
クロージャを使って関数をメモ化することで、同じ引数での繰り返し呼び出しを効率化できます。以下は、与えられた関数をクロージャとメモ化を使って最適化したバージョンです。

``` Javascript
function createMemoizedGetValueFromAColumn() {
  var cache = {};
  
  return function(targetValue) {
    if (cache[targetValue] !== undefined) {
      return cache[targetValue];
    }
    
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
    if (!sheet) {
      throw new Error('シート「sheet1」が見つかりません');
    }
  
    var data = sheet.getRange('D:D').getValues();
    
    for (var i = 0; i < data.length; i++) {
      if (data[i][0] === targetValue) {
        var valueInAColumn = sheet.getRange('A' + (i + 1)).getValue();
        cache[targetValue] = valueInAColumn;
        return valueInAColumn;
      }
    }
    
    cache[targetValue] = null;
    return null;
  };
}

// メモ化された関数のインスタンスを作成
var getValueFromAColumn = createMemoizedGetValueFromAColumn();

// 例の使用法
function testGetValueFromAColumn() {
  var result1 = getValueFromAColumn('検索したい値');
  Logger.log(result1);
  
  var result2 = getValueFromAColumn('検索したい値'); // ここではキャッシュされた値が使用されます
  Logger.log(result2);
}

```

### 入力文3
>上記の関数を使用したクラスを作ってください。ただし、キャッシュクリアするメソッドを追加してください

###GPT

以下は、メモ化機能とキャッシュクリアメソッドを持つクラスを実装したものです。このクラスを使用することで、与えられた条件に基づいてスプレッドシートの値を取得し、必要に応じてキャッシュをクリアできます。

### クラスの実装

```javascript
class SpreadsheetValueFetcher {
  constructor(sheetName) {
    this.sheetName = sheetName;
    this.cache = {};
  }
  
  getValueFromAColumn(targetValue) {
    if (this.cache[targetValue] !== undefined) {
      return this.cache[targetValue];
    }
    
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(this.sheetName);
    if (!sheet) {
      throw new Error(`シート「${this.sheetName}」が見つかりません`);
    }
    
    const data = sheet.getRange('D:D').getValues();
    
    for (let i = 0; i < data.length; i++) {
      if (data[i][0] === targetValue) {
        const valueInAColumn = sheet.getRange('A' + (i + 1)).getValue();
        this.cache[targetValue] = valueInAColumn;
        return valueInAColumn;
      }
    }
    
    this.cache[targetValue] = null;
    return null;
  }
  
  clearCache() {
    this.cache = {};
  }
}

// 例の使用法
function testSpreadsheetValueFetcher() {
  const fetcher = new SpreadsheetValueFetcher('現状');
  
  const result1 = fetcher.getValueFromAColumn('検索したい値');
  Logger.log(result1);
  
  const result2 = fetcher.getValueFromAColumn('検索したい値'); // ここではキャッシュされた値が使用されます
  Logger.log(result2);
  
  fetcher.clearCache();
  
  const result3 = fetcher.getValueFromAColumn('検索したい値'); // キャッシュクリア後なので、再度シートから取得します
  Logger.log(result3);
}
```

### 説明

1. **クラス定義**:
   - `SpreadsheetValueFetcher`クラスは、シート名をコンストラクタで受け取り、キャッシュを初期化します。

2. **メソッド**:
   - `getValueFromAColumn(targetValue)`: 指定された値をD列から検索し、該当する行のA列の値を返します。キャッシュに値が存在する場合はキャッシュから取得し、存在しない場合はシートから取得してキャッシュに保存します。
   - `clearCache()`: キャッシュをクリアします。

3. **例の使用法**:
   - `testSpreadsheetValueFetcher`関数でクラスのインスタンスを作成し、値を取得します。
   - キャッシュされた値を使用し、キャッシュをクリアして再度値を取得する動作を確認します。

このクラスを使用することで、効率的にスプレッドシートのデータを取得し、必要に応じてキャッシュをクリアすることができます。