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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

解決済

Steinで適切なセルに入力されない。

NaokiUchid
NaokiUchid

総合スコア14

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

2回答

0リアクション

0クリップ

380閲覧

投稿2022/07/06 15:02

編集2022/07/11 11:01

実現したいこと

steinを使ってGoogleスプレッドシートに書き込みを行っていますが、適切なセルに文字が入力されない。

発生している問題・エラーメッセージ

サンクスレポートとヒヤリハットレポートをGoogleフォームから入力し、入力されたものがスプレッドシートに記載されています。
このスプレッドシートの一部をウェブ状に表示しレポートを閲覧してもらうというのがwebアプリのベースです。
レポートを閲覧した際にポイントが入るように、レポート閲覧のボタンを押す際に名前をinputタブに入力すると、その入力された名前がnameReadセルに書き込まれていくという仕様をsteinを用いてスプレッドシートをデータベース化することでおこなっています。

inputの部分でnameのidをつけて入力されたものがnameReadセル(W列)、入力した際の時間がタイムスタンプセル(A列)に入力されるようにコードを書いています。

しかし、W列にタイムスタンプが入力され、

イメージ説明

右に19マスずれた位置(AS列)に名前(ここでは「氏名」と入力)が入力されます。

イメージ説明

さらに続けて入力すると先ほど名前が入力されたセルの真下にタイムスタンプが入力され、また右に19マスずれた位置に名前が入力されます。

イメージ説明

入力するたびに名前が入ったセルの下に時間が入力され、その19マスずれたところに名前が入力されていきます。

Chromeの検証画面では特にエラーメッセージは表示されません。

該当のソースコード

サンクスレポートの閲覧画面

html

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>スマレポ</title> <link rel="stylesheet" media="print" href="print.css" /> <link rel="shortcut icon" href="favicon.ico" /> <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.4.1/font/bootstrap-icons.css" rel="stylesheet" /> <link href="./thx.css" rel="stylesheet" /> </head> <body> <div class="container px-lg-5"> <h1>サンクスレポート</h1> <input type="text" id="name" placeholder="氏名(スペース入れない)" required /><br /> <button onclick="thx()">サンクスレポート表示</button> </div> <script src="https://unpkg.com/stein-js-client"></script> <script> const store = new SteinStore( "https://api.steinhq.com/v1/storages/XXXXXXXXXX" ); async function thx() { const data = await store.read("sheet1", { limit: 1000, offset: 0 }); console.dir(data); console.log(" - - - - - - - - - - - "); for (let i = data.length - 1; i >= 0; i--) { const element = data[i]; const thxdata = element.サンクスレポートの内容; console.log(thxdata); if (thxdata !== null) { const newDiv = document.createElement("div"); const newContent = document.createTextNode(thxdata); newDiv.appendChild(newContent); var currentDiv = document.getElementById("div1"); document.body.insertBefore(newDiv, currentDiv); } } await store.append("sheet1", [ { "nameRead": document.getElementById("name").value, "タイムスタンプ": new Date().toISOString(), }, ]); } </script> </body> </html>

ヒヤリハットレポート閲覧画面

html

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>スマレポ</title> <link rel="stylesheet" media="print" href="print.css" /> <link rel="shortcut icon" href="favicon.ico" /> <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.4.1/font/bootstrap-icons.css" rel="stylesheet" /> <link href="./hyr.css" rel="stylesheet" /> </head> <body> <div class="container px-lg-5"> <h1 class="pt-3">ヒヤリハットレポート</h1> <input type="text" id="name" placeholder="氏名(スペース入れない)" required /><br /> <button onclick="hyr()">ヒヤリハットレポート表示</button> </div> <script src="https://unpkg.com/stein-js-client"></script> <script> const store = new SteinStore( "https://api.steinhq.com/v1/storages/XXXXXXXXXX" ); async function hyr() { const data = await store.read("sheet1", { limit: 1000, offset: 0 }); console.dir(data); console.log(" - - - - - - - - - - - "); for (let i = data.length - 1; i >= 0; i--) { const element = data[i]; const hyrdata = element.内容; const hyrrp = element.発生時の対応; const hyrreason = element.原因; const hyrreact = element.今後の対応; const hyrleader = element.上長のコメント; const hyrdirector = element.院長のコメント; console.log(hyrdata); if (hyrdata !== null) { const newDivhd = document.createElement("div"); const newContenthd = document.createTextNode("[内容]" + hyrdata); newDivhd.appendChild(newContenthd); var currentDivhd = document.getElementById("div1"); document.body.insertBefore(newDivhd, currentDivhd); const newDivhr = document.createElement("div"); const newContenthr = document.createTextNode( "[発生時の対応]" + hyrrp ); newDivhr.appendChild(newContenthr); var currentDivhr = document.getElementById("div1"); document.body.insertBefore(newDivhr, currentDivhr); const newDivhn = document.createElement("div"); const newContenthn = document.createTextNode("[原因]" + hyrreason); newDivhn.appendChild(newContenthn); var currentDivhn = document.getElementById("div1"); document.body.insertBefore(newDivhn, currentDivhn); const newDivct = document.createElement("div"); const newContentct = document.createTextNode( "[今後の対応]" + hyrreact ); newDivct.appendChild(newContentct); var currentDivct = document.getElementById("div1"); document.body.insertBefore(newDivct, currentDivct); const newDivle = document.createElement("div"); const newContentle = document.createTextNode( "[上長のコメント]" + hyrleader ); newDivle.appendChild(newContentle); var currentDivle = document.getElementById("div1"); document.body.insertBefore(newDivle, currentDivle); const newDivdi = document.createElement("div"); const newContentdi = document.createTextNode( "[院長のコメント]" + hyrdirector ); newDivdi.appendChild(newContentdi); var currentDivdi = document.getElementById("div1"); document.body.insertBefore(newDivdi, currentDivdi); const newDivmm = document.createElement("div"); const newContentmm = document.createTextNode("⭐️"); newDivmm.appendChild(newContentmm); var currentDivmm = document.getElementById("div1"); document.body.insertBefore(newDivmm, currentDivmm); } } await store.append("sheet1", [ { nameRead: document.getElementById("name").value, タイムスタンプ: new Date().toISOString(), }, ]); } </script> </body> </html>

試したこと

簡易版(入力項目が一つしかないもの)を別で作成し表示部分以外は同じコードで作成したところ適切なセルに入力されました。

しかし、別施設に導入している似たコードにおいても、上記と同様の入力部分がずれるバグが発生しています。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

qnoir

2022/07/10 04:40 編集

現状の文章だけでは下記の情報がわかりません。 ・現状の記録用スプレッドシートの全体像(どの列にどのような情報が入っているのか)←これが示されていないのは解決の上で致命的です。 ・「nameRead」セルとは、どの位置のセルであり、何を意味するのか ・「さらに続けて入力すると先ほど名前が入力されたセルの真下にタイムスタンプが入力され、また右に19マスずれた位置に名前が入力される」とありますが「先ほど名前が入力されたセル」とは、スプレッドシートのどのような位置なのか。 要するに、 質問文記載コードは、「ブラウザに何らかのUIを表示し、何らかのデータを入力すると、Googleスプレッドシートの何らかの適切な位置に(そのデータをもとに加工された1つ以上の)データを入力する」ものだと思われますが 正しい処理(期待する動作)は、どのような処理で、それが現状、どうなってしまっているのか、ということです。 インプット・アウトプットともに、画像と文章で、何も情報を持たない第三者にもわかるように説明してください。 例) ブラウザの、この部分に、○○を入力し、ボタンを押す ↓ 入力された○○を、プログラム内で、データ△△に変換する。 (記録用スプレッドシートの++からとってきたデータを◎◎に加工する、等) ↓ 正常であれば変換されたデータ△△は、◇という基準に従って、スプレッドシートのs行目・t列目のセルに入るはずである。 ところが、現状、s行目・t列目ではなく、z0列目に入力されてしまっている。 同じことを繰り返すと、さらにz1列目に入力されてしまう。 --- (プライバシーの問題がある場合は、ダミーデータに差し替えてください)
NaokiUchid

2022/07/10 04:33

なるほど。 丁寧にありがとうございます。 質問を修正してみます。
qnoir

2022/07/10 04:41

コメントしたものの、コードとAPIのドキュメントから想像で補完して、だいたいのところはわかりました。steinsのバグと思われます。 解決法を記載する準備中ですのでしばらくお待ちください。
qnoir

2022/07/10 05:28

解決策および再現手順について追記しました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。