Google App Makerとスプレッドシートを駆使してシステムを構築する②(スプレッドシートのデータを変更する)

#やること
Google App Makerがイケてるツールなのかを知るために、簡易なシステムを作ってみる。
(スプレッドシートをDB代わりにする)

前回に引き続き2回目なので、前提とかは割愛

目次
- [スプレッドシートのデータを表示する](https://qiita.com/kanametunes/items/96b13f19685553416077)　(前回)
- データを変更する　← **今ココ**
- データを新規登録する
- 検索する

#やってみる（前回からの続きです）

- PAGEの「＋」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/befc5283-3e3f-eca4-9cdd-ee505cbf33a0.png)

- PAGEをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/2e6b3b6b-e156-9b44-e704-5388341faae8.png)

- 適当に名前決める

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/5fdfeec2-fab7-b92d-dd89-c48bf3e7d006.png)

- Fixed Pannelを配置する（今回スプレッドシートをDBにするのでフォームは使えない）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/39f782c9-faa7-9683-380d-f4308a4dab64.png)

- 上記設置したパネル内にラベルとテキストボックスとボタンを配置

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/31b3542c-dc43-cc49-c049-9049b25eb24d.png)

- テキストボックスをクリックすると右にProperty Editorが表示されます。VALUEの箇所をbindingを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/ae403301-d0cb-b619-0b6b-ce74f5e3246f.png)

- 表示された画面で
  datasource - [今回作ったデータソース名] - item - [紐つける項目名]　の順にクリック
　（これをやる事で前回作った一覧上でクリックしたレコードと、このテキストボックスが紐付き値が連携されます）
　全てのテキストボックスで実施

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/50e1debf-86d1-6aff-31af-aeedb9850712.png)

- 次に一覧からレコードをクリックすると今作った編集画面に遷移するよう設定します。
　前回作った一覧画面の(タイトル行ではない)その下の行をクリックし、右に表示された「onClick」をクリック
　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/6464340a-5fff-b023-e077-369dd70b3d64.png)

- 表示された「Navigate To Page」をクリック、さらに、作成した編集画面をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/86cbe8d1-5b64-86dd-631e-9bd933a0dd04.png)

- 次は「BUTTON」をクリックした時に、変更した内容がデータソースになっているスプレッドシートに反映されるようにします。
　編集画面のボタンの「onClick」をクリックし「Custom Action」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/f6c55fc3-2e5e-09e1-4ff0-6afdcfe74dec.png)

- 表示された画面に下記入力

```javascript:test.js
//フォームの値を(このあと作ります)edit関数へ渡す
edit(widget.parent.descendants.TextBox1,widget.parent.descendants.TextBox2,widget.parent.descendants.TextBox3);
```
- スクリプトを新規作成、「Client」を選択して「CREATE」
　同じように「Server」でも作成する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/7b8990f9-1c72-1ab2-6ad5-5fca37e6f14b.png)

- スクリプト内に下記コードを入力します。

```javascript:Client.js
function edit(id,name,mail) {  
//サーバへ処理を渡す
  google.script.run
//エラーの場合は下記が実行される
  .withFailureHandler(function(error) {
    console.error('error: '&error);
  })
//成功した場合は下記が実行される
  .withSuccessHandler(function(rows) {
    app.datasources.shain.load();
  })
//実際にサーバにわたす処理
  .edit(id,name,mail);  
}
```
```javascript:Server.js
function edit(id,name,mail){
  var index = [];
  //スプレッドシートのデータ取得
  var spreadsheet = SpreadsheetApp.openById("ここに基データとなるスプレッドシートのID記載");
  var sheet = spreadsheet.getSheetByName("シート名を記載");
  var rows = sheet.getDataRange().getValues();
    
  //フォームのIDを元に、該当レコードを見つけ、nameとmailを更新。インデックスも取得。
  rows.forEach(function(row,i){
    if(row[0] == id ){
      row[1] = name;
      row[2] = mail;
      index.push(i);
    }
  });
//念の為重複チェック
  if(index.length === 1){
    var j = index[0];//もしかしたら重複あるかも
  }else{
    throw new Error ('重複がありました'); 
  }
  //書き換える
  sheet.getRange(j+1,1,1,rows[j].length).setValues([rows[j]]);    
}

```

#結果
これでスプレッドシートの該当レコードが変更されているはず！

次回は「データを新規登録する」をやろうかと思います。

- スプレッドシートのデータを表示する　
- データを変更する　← **今ココ**
- データを新規登録する
- 検索する