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

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

ただいまの
回答率

89.63%

入力済みのスプレッドシートにフォームから希望箇所だけ修正かけたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,212

sivaya

score 6

 前提・実現したいこと

GASを使用して、フォームからスプレッドシートにデータを入力・編集したい。→できた

フォームで入力された番号によってデータを書き込む行を指定して入力したい。→できた

既にデータが入力してある行の一部に修正や追加を行いたい時、そのままで良い箇所までフォーム上で再入力するのは面倒なので、編集・修正したい箇所のフォーム項目だけ入力することで、その他の未入力部分を""で上書きすることなく(でも今のままだとそうなってしまう。セルの中身が真っ白に飛ぶ)修正希望の項目だけ編集できるようにしたい。→やり方わからない

どのようにすればよいでしょうか。

フォームにデータNo.を入力すると他の項目フォームに既に入力してあるデータをシートから読んでその値を入力済みの状態にすればいいのかな?と思いますが、そのやり方がわかりません……。

他のやり方、違う考え方に基づく方法でも構いません。
該当箇所だけを部分的に直せるようにするにはどうしたら良いでしょうか?

初心者です。コピペですぐ使えるコードをクレとは申しませんが
なるべく具体的にわかりやすく教えていただけるとありがたいです。
変数名からお察しの通り、ビジネスユースではなく趣味で使用したいものなので高速化にはそれほどこだわりはありません。とりあえず動けばいいと思っています。

でも趣味なら信頼してる人だけにURL教えてスプレッドシートを直に編集させればいいじゃない、という回答はナシでお願いします……。

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

今の状態ではエラーは起きていません。

 GAS

function doPost(e){

//データ取得 長すぎなので割愛。実際は28項目あります
  var number = e.parameter.number;
  var chrName = e.parameter.chrName;
  var type = e.parameter.type;
//配列に格納
  var arrData = [[chrName,type]];

//入力先の行番号を特定
  var rowNum = parseInt(number)+1;

//データを記録するスプレッドシート idはダミーです。テスト時は実際のurlを使っています
  var mySheet =SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/XXXX/edit#gid=0"); 

//データを記入。未入力項目があると入力されていた情報が飛んでしまう。
//範囲指定されてる列数多すぎなのは本当は28項目あるから。
  mySheet.getRange("C"+rowNum+":AD"+rowNum).setValues(arrData);  

  return HtmlService.createHtmlOutputFromFile("EntryForm");
}

function doGet() {  
  var html = HtmlService.createTemplateFromFile('EntryForm');  
  return html.evaluate();  
}

 HTML

<!--body内のformの中から3項目だけ抜粋-->

<form method="post" action="https://script.google.com/macros/s/XXX/dev">

    <label for="number">キャラNo.<span class="red">(必須)</span></label>   
    <input type="number" name="number" required />   

    <label for="chrName">キャラクター名</label>
    <input type="text" name="chrName"/> 

    <label for="type">タイプ</label> 
      <select name="type">    
        <option value=""></option>
        <option value="A">A</option>
        <option value="B">B</option>
        <option value="C">C</option>
      </select>       

<input type="submit" value="登録する">

</form>

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

自己解決しました。
最初はフォームのテキストボックスに修正をかけたいデータのIDを入力し、
そのIDを参照してスプレッドシートの行数を特定して値を読み込み
フォームに表示させればいいのかな?と考えていましたが
それだと、まず番号を入力→読込ボタン押す→からの入力、という手間が増える仕様になるのでやめました。

フォームへのリンクを置く個別データページにURLパラメーター(ID)を付与して
その番号を見て、スプレッドシートから指定の入力済みのデータをひっぱり
フォームの初期値としてセットする、という仕様にしました。
修正かけたい個別ページからアクセスすれば入力済みの値がセットされたフォームが出るので、
そこで修正部分だけ編集して送信すれば、セルが真っ白に飛ぶこともなくなりました。

質問の仕方がふわっとしすぎてすみませんでした。。
やりたいことは一言で言うと、DBとDB入力のためのGUIを作りたかったのです。
知らないことが多すぎると、ピンポイントな質問もできません。

GASからHTMLへ複数セルの値を受け渡すのはjsonがよきかな、と聞いたのですが
やり方が悪かったのかエラーの嵐で断念しました。。
最終的にこういうコードにしました。
GAS
function doGet(e) {  
var html = HtmlService.createTemplateFromFile('EntryForm'); 
var cid = e.parameter.cid;  //URLパラメーターからID取得
var rowNum = parseInt(cid)+1; //idを行番号に変換
var mySheet =SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/SHEETID/edit#gid=0");  
var range = mySheet.getRange("C"+rowNum+":AD"+rowNum); //データの入っているC~AD列の1行をrangeとする
var defSet = range.getValues();
html.defSet = defSet;
html.cid =cid;
return html.evaluate(); 
}

HTML内のjavascript
<script>
var cid = <?=cid?>;
document.getElementById("number").value = cid;
var defSet = <?=defSet?>;
var sData = defSet.split(","); //配列に変換
document.getElementById("chrName").value = sData[0];

・(項目の数だけ代入。あまり美しいコードは言えないがよしとする)

</script>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる