質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1418閲覧

Vue.jsでテーブルに行を「push」メソッドで追加しているのですが、表示されるボタン名を動的に変更したい

zigutabi

総合スコア57

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2021/06/01 06:10

編集2021/06/01 10:46

現在、スプレッドシートをDB代わりに使用するWEBアプリを作成しております。
その中の一つに、WEB画面上にテーブルの一覧を表示させ、更新、追加する機能を実装しております。
更新する処理は実装できたのですが、新規追加がまだできておりません。

pushメソッドを使用することで行を追加することができたのですが、上記テーブル要素をそのまま複製したような行が追加され、Buttonの中身を変更することができませんでした。
公式リファレンスを読んだのですが、pushメソッドに何を入れるのかが書いてなかったので、理解しかねている状態です。
左が追加ボタンを押す前、右が追加ボタンを押した後になります。
イメージ説明

その際、追加された行のボタンのテキストが「更新」と表示されます。
自分が使用するのなら問題ないのですが、このツールは他者が使用することを前提としているので、
更新のままですと誤解の原因になりかねないので、「登録」と変更したいです。

以下が実際のコードになります。
Javascriptの方はバッググランドで動いているgsファイルになります。

js

1function doGet(e){ 2 const html = HtmlService.createTemplateFromFile("index"); 3 return html.evaluate(); 4} 5 6// スプレットシートに登録しているデータをWEB上に表示 7const importRecords = () => { 8 const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 9 const values = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).getValues(); 10 values.shift(); 11 12 return values; 13} 14 15// WEB上から入力された情報をスプレットシートに反映 16const updateRecords = (id, text) => { 17 const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 18 const values = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).getValues(); 19 20 const idxes = values.map(e => e[0]); 21 const idx = idxes.indexOf(Number(id)); 22 sh.getRange(idx + 1, 2).setValue(text); 23 24 // 他ユーザーが変更した内容を反映するのに、再描画を実施 25 return importRecords(); 26}

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 <style> 6 li{ 7 margin-top: 5px; 8 } 9 </style> 10 </head> 11 <body> 12 <div id="app"> 13 <table> 14 <tr> 15 <th>テキスト</th> 16 <th></th> 17 </tr> 18 <tr v-for="(row, index) in rows" :key="index"> 19 <td> 20 <!-- スプレッドシートの第一列をプライマリーキーと設定し、それを非表示にしている --> 21 <input v-model='rows[index][0]' type="hidden" /> 22 <input v-model='rows[index][1]' /> 23 </td> 24 <td> 25 <button v-on:click="updateData" name="action">更新</button> 26 </td> 27 </tr> 28 </table> 29 {{sheetData}} 30 <button v-on:click="append">追加</button> 31 <p>{{message}}</p> 32 </div> 33 34 <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script> 35 <script> 36 const vm = new Vue({ 37 el: '#app', 38 data:{ 39 "message": null, 40 "rows": [] 41 },computed:{ 42 "sheetData":function(){ 43 google.script.run.withSuccessHandler(function(data){ 44 vm.rows = data; 45 }).importRecords(); 46 } 47 },methods:{ 48 "updateData": function(event){ 49 const parent = event.path[2].children; 50 const inputData = parent[0].children; 51 52 google.script.run.withSuccessHandler(function(data){ 53 vm.rows = data; 54 }).withFailureHandler(function(data){ 55 vm.message = "Error"; 56 }).updateRecords(inputData[0].value, inputData[1].value); 57 },"append": async function(){ 58 vm.rows.push("0"); // ここの処理がよくわからない 59 } 60 } 61 }); 62 </script> 63 </body> 64</html>

スプレットシートにあるデータは以下の通りです。

NoText
1Osaka
2Sapporo
3Tokyo
4Nagoya

改めて、「更新」ボタンのテキストを「登録」に変更するにはどうしたらいいでしょうか?

ご質問にありました、ログの結果は以下の通りです。
(5) [Array(2), Array(2), Array(2), Array(2), "0", ob: Observer]
0: Array(2)
0: 1
1: "Sapporo"
length: 2
ob: Observer {value: Array(2), dep: Dep, vmCount: 0}
proto: Array
1: (2) [2, "Nagoya", ob: Observer]
2: (2) [3, "Mito", ob: Observer]
3: (2) [4, "Tokyo", ob: Observer]
4: "0"
length: 5
ob: Observer {value: Array(5), dep: Dep, vmCount: 0}
proto: Array

新規追加されたのは、「4:"0"」になります。
ブラウザのコンソールから出力しているので、余計な要素が付いておりますが、ご容赦ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/01 06:40

>改めて、「更新」ボタンのテキストを「追加」に変更するにはどうしたらいいでしょうか? のところの具体的な内容・意図を教えてください。 ・質問文の中の画像の左の状態で、一番下の「追加」ボタンを押した後、空欄のテキストボックスが追加されるということですよね? その新規追加されたテキストボックスの右隣にあるボタンの表示が、現状は「更新」となっていますが、「更新」ではなく「追加」という表示にしたい、ということでしょうか? さらに ・テキストボックスが空欄のときはボタンの表示は「追加」で、テキストボックス内に何か文字が入力されていたらボタンの表示を「更新」にしないといけないでしょうか?
zigutabi

2021/06/01 07:36

すみません、誤りがあったので修正しました。 追加された空白行は、データを更新するのではなく、新規に登録させるという意味でボタン内のテキストを「更新」ではなく、「登録」に変更したいということです。 使用するのは開発した自分ではなく、他のチームの人になります。 そうなると、誤解の元になるので、表示を切り替えたいという考えです。
m2l

2021/06/01 10:14

一つ確認してもよろしいでしょうか? appendしたタイミングでrowの中身がどうなっているかログでもなんでもよろしいのでご提示頂けますとご質問に回答できるかと思います。
退会済みユーザー

退会済みユーザー

2021/06/01 10:19

スプレッドシートの1列目の「No」というのは、1行目にあり、2行目以降は、必ず1始まりの連続した数字にしなければいけないのでしょうか?
zigutabi

2021/06/01 10:31 編集

1列目はプライマリーキーです。 数値の値は何でもいいのですが、これがないと、何行目を修正したのかわからなくなるので、入力した次第です。 今はサンプル版で動かしているので簡略化しておりますが、実際のデータはこれ以上あり、また誤入力対策も想定しているので、念のためプライマリーキーを設定しているところです。
退会済みユーザー

退会済みユーザー

2021/06/02 11:02 編集

削除
退会済みユーザー

退会済みユーザー

2021/06/01 10:48

すみません、私が誤解している可能性があるので念のため確認なのですが、記載のソースコードは省略形であって、実際のコードではバグなしで正常に動かせている、(けれどもボタンの表示の更新のところだけ知りたい)ということだったのでしょうか?
zigutabi

2021/06/01 11:03

説明不足ですみません。 現在作っているところは、本来は社員のメールアドレスと表示名、その他プロパティを登録するところです。 ただ、Vue.jsを用いてのGASのWEBアプリ開発は初めてなので、どのような構造になるのか不明だったので、別途骨組み試験用環境で開発している次第です(例えば、google.script.runを使用して非同期処理でデータを取得する方法等)。 なので、ここでアップしたものがフル状態になります。 プライマリーキーは、テキストの更新処理の時に使用しているので、使用している状態です。
退会済みユーザー

退会済みユーザー

2021/06/02 11:01 編集

削除
zigutabi

2021/06/02 04:01

すみません、何を聞いているのかさっぱりわかりません。 修正依頼をするのでしたなら、私が質問している範囲内で質問してもらえないでしょうか?
guest

回答1

0

ベストアンサー

意図した回答でなければ申し訳ございませんが、
スプレッドシートと紐づいている形であれば下記でいかがでしょうか?

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 <style> 6 li{ 7 margin-top: 5px; 8 } 9 </style> 10 </head> 11 <body> 12 <div id="app"> 13 <table> 14 <tr> 15 <th>テキスト</th> 16 <th></th> 17 </tr> 18 <tr v-for="(row, index) in rows" :key="index"> 19 <td> 20 <!-- スプレッドシートの第一列をプライマリーキーと設定し、それを非表示にしている --> 21 <input v-model='rows[index][0]' type="hidden" /> 22 <input v-model='rows[index][1]' /> 23 </td> 24 <td> 25 <button v-on:click="updateData" name="action"> 26 {{rows[index][0] === '0' ? '追加' : '更新'}} 27 </button> 28 </td> 29 </tr> 30 </table> 31 {{sheetData}} 32 <button v-on:click="append">追加</button> 33 <p>{{message}}</p> 34 </div> 35 36 <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script> 37 <script> 38 const vm = new Vue({ 39 el: '#app', 40 data:{ 41 "message": null, 42 "rows": [] 43 },computed:{ 44 "sheetData":function(){ 45 google.script.run.withSuccessHandler(function(data){ 46 vm.rows = data; 47 }).importRecords(); 48 } 49 },methods:{ 50 "updateData": function(event){ 51 const parent = event.path[2].children; 52 const inputData = parent[0].children; 53 54 google.script.run.withSuccessHandler(function(data){ 55 vm.rows = data; 56 }).withFailureHandler(function(data){ 57 vm.message = "Error"; 58 }).updateRecords(inputData[0].value, inputData[1].value); 59 },"append": async function(){ 60 vm.rows.push("0"); // ここの処理がよくわからない 61 // ここの処理は"0"が追加するキーという意味合いで定義しているのであれば、arrayが異なるので下記のような形で動くのであれば下記にした方が良いかと思いました。 62 // vm.rows.push(["0", ""]); 63 } 64 } 65 }); 66 </script> 67 </body> 68</html>

投稿2021/06/01 11:02

m2l

総合スコア318

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zigutabi

2021/06/01 11:16

無事、クリアすることができました。 処理の振り分けはバックグランドで実装します。 今はv-modelで書いてますが、調べてみたら参照するだけならv-bindがいいそうなので、v-bindに書き直したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問