Google App Maker スプレッドシートをDBにする　～その弐 更新～

まずはじめに
-
[Google App Maker スプレッドシートをDBにする　～その壱 表示～](https://qiita.com/Ringo_o/items/a36cf9c35a8dca97805e)

続いては更新になります。
表示したデータの編集画面の作成、更新処理の実装になります。

それではやっていきましょう

編集画面の作成
-
左メニューにあるウィジェットマーク -> Form をページにドラック&ドロップ
PAGEにチェックをいれ、NEXT
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/e5bb5ee3-ff95-61cd-3f8a-0de5e9cec263.png)
編集画面の名前をつけ、Page Datasourceは前回作成したtestDBを設定し、CREATE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/79d0db40-2e2a-659e-d5cc-295bcc5e5fe0.png)
testDBを選択してNEXT
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/4cb83b77-5dd9-3827-3597-619836c08a2f.png)
Editを選択してNEXT
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/5770e54f-1b3b-5180-0efb-f3ec8b0f06ec.png)
ここでeditableにチェックは入れられません。編集機能は自前で実装します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/dcecf227-1e4c-4192-aa70-2102c1a0f575.png)
こんな感じで表示されていればOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/585d056f-701f-8440-2522-2a48233fd403.png)

編集画面が作成できましたのであとは前回作ったlistからedit画面に遷移するようにします。
listの行を選択し、Property Editor -> Events -> onClickを選択し、Navigate to Page... -> editを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/92039afd-e712-aeb8-4c64-f2003ffe84b9.png)

ここで一度、確認してみましょう。
listの行をクリックするとeditに遷移し、クリックした行のデータが表示されていればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/a7fd6fc4-b540-db93-9259-df765d3823c5.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/e87e42e3-51d1-3dd7-a4cf-c814fa4bb47b.png)


気づきましたか？
editに一度遷移するとlistに戻れないんです！しかも値の編集もできない！
ということでまずはBACKボタンも作りましょうか。もう何をするかお分かりですね。
edit画面にウィジェットからボタンを配置してEvents -> onClickからNavigate to page...->listを設定します。
（ついでに更新ボタンも置いちゃいました。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/b7154378-99bb-24df-f085-96e1c114e3a0.png)
あとここではNo以外を編集できるようにしなければなりません。
一旦、@Company,@Structure.@Nameを削除します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/6d72d43c-d382-b8c9-1428-873c51351e99.png)
ウィジェットからtextboxを選択して配置します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/970b8067-59bb-c58f-e435-366d5db510b5.png)
配置したtextboxを選択してProperty Editor -> value -> binding
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/5c60b900-fd66-7e0f-3bf9-b682cc26cbe2.png)
ここではCompanyを選択してこのようになればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/9b641306-bbbc-fd83-be68-29b82b49e9b3.png)
これをStructure,Nameそれぞれ設定してください。

再度、プレビューから編集画面への遷移していただき、No以外が編集できること、BACKボタンでlistに遷移することを確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/53ea7ff0-815a-aa1f-646b-5385351765b5.png)


更新処理
-
これからScriptを書いていきます。
Client Script,Server Scriptどちらも必要です。

まずはUPDATEボタンを押した後に更新処理＆listに戻ってほしいのでボタンのonClickイベントを書きます。
配置したUPDATEボタンを選択してProperty Editor -> onClick -> Custom Action

```js
updateCell();
app.showPage(app.pages.list);
widget.datasource.load();
```
左メニューのSCRIPT「＋」 -> Client を選択 -> CREATE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/36b1347b-22c6-777e-91fd-370f9fac3522.png)

```js
/*
 * スプレッドシートID、シート名
 */
var SPREADSHEET_ID = 'スプレッドシートID';
var SHEET_NAME = 'シート名';

/*
 * 更新処理
 */
function updateCell() {
  
  var updateRow = Number(app.pages.edit.descendants.Field3.text);
  var company = app.pages.edit.descendants.TextBox1.value;
  var structure= app.pages.edit.descendants.TextBox2.value;
  var name = app.pages.edit.descendants.TextBox3.value;
  
  var array = [updateRow,company,structure,name];
  
  google.script.run.setValue(SPREADSHEET_ID,SHEET_NAME,array);
}
```

左メニューのSCRIPT「＋」 -> Server を選択 -> CREATE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/201d17c1-fd48-f3d8-27e8-447c2c4d0abb.png)

```js
/*
 *更新処理
 */
function setValue(spreadsheetId, sheetName, array){
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  var updateRow = Number(array[0]) + 1;
  
  for (var i = 0; i < array.length; i++){
    var column = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var range = column.substr(i, 1) + updateRow;
    var cellRange = sheet.getRange(range);
    
    cellRange.setValue(array[i]);
  }
}
```

確認してみます。
プレビューから編集画面へいき、項目を編集してUPDATEボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/e99cc0f6-b58c-c032-d2aa-329217b0a5be.png)
とりあえずlistに遷移して、値も編集した内容に変わっていますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/4a99b8e6-38e3-ffe6-d934-e4cd77f8ebcb.png)
スプレッドシートも変わっていますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/6f4d90c0-197d-4127-35be-49247cec183e.png)

いかがだったでしょうか。
面白いですよね、AppMaker！
少し長くなりましたここまで見てくださった方ありがとうございました。

ここまで出来れば追加も簡単ですが、次回は行を追加してみます。