@hiroshi0410

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GAS超初心者です・・・

GASの初心者です。

スプレッドシートで金額・商品名・店名のボックスを作成して「登録」ボタンを押すと、ボックスから自動で削除されて、決められてボックスに次々と蓄積されていくコードを書きたいのですが・・・

どのように作成を進めていったら宜しいのでしょうか?

0 likes

1Answer

まず,

スプレッドシートで金額・商品名・店名のボックスを作成して「登録」ボタン

のところは他サイトで詳しく掲載されているので,そちらを参照していただくものとして,
「取り組んでみたこと」の欄が記載されていないので,「コードを書きたい」という所だけを汲み取ってコード例を示したいと思います.

まず,セルA2に金額,B2に商品名,C2に店名が入力されたシートFormがあるとします.

スクリーンショット 2022-02-14 15.36.57.png

今回は同じスプレッドシート内に,蓄積する先のシートDataBaseも用意しました.これは適宜実装したい仕様に合わせて他のスプレッドシートに移すことも可能です.上の「登録」ボタンを押下すると値が最後の行に追加されます.そしてフォームに入力された値は消えます.これで意図した仕様になっていますでしょうか.

スクリーンショット 2022-02-14 15.46.31.png

登録ボタンに割り当てたスクリプト名はsubmit_formとしましたので,GASでは以下のように書くことになります.

REPLACE_YOUR_IDのところはスプレッドシートのURLのhttps://docs.google.com/spreadsheets/d/REPLACE_YOUR_ID/editの位置にあるIDを適宜置換してください.

コード例
function submit_form() {
  let ss = SpreadsheetApp.openById("REPLAFE_YOUR_ID"); //スプレッドシートを取得
  let form =  ss.getSheetByName("Form"); // 入力されたformのシートを取得
  let db =  ss.getSheetByName("DataBase"); // 出力先のシートを取得
  
  let nextRow = db.getLastRow() + 1; // 出力先のシートdbの最後の行を取得
  let form_money = form.getRange("A2"); // 入力フォームformのうち金額欄A2を取得
  let form_product = form.getRange("B2"); // 入力フォームformのうち商品名欄B2を取得
  let form_shop = form .getRange("C2");  // 入力フォームformのうち店名欄C2を取得
  // 金額欄form_moneyに入力されている値をgetValue()で抜き出して,出力先のシートの最後の行にsetValue()で挿入
  db.getRange(nextRow, 1).setValue(form_money.getValue()); 
  form_money.clear(); // 金額欄form_moneyをclearで削除
  db.getRange(nextRow, 2).setValue(form_product.getValue()); // 同上
  form_product.clear(); // 同上
  db.getRange(nextRow, 3).setValue(form_shop.getValue()); // 同上
  form_shop.clear(); // 同上
}

流れとしては,コードそのまま

  1. Class SpreadsheetAppからopenById()を用いてClass SpreadSheetを取得し,変数ssに代入.
  2. 先ほど取得したスプレッドシートssからClass SheetformgetSheetByName()で取得.
  3. 同様に,スプレッドシートssからClass SheetdbgetSheetByName()で取得.
  4. 先ほど取得したシートdbからgetLastRow()で最後の行を取得し,+1して次に挿入するべき行として変数nextRowに代入.
  5. フォームの各セルClass RangegetRange()で取得.
  6. フォームの各セルにある値をgetValue()で取得する.
  7. 蓄積先のシートのセルClass RangegetRange()で指定,setValue()で先ほど取得したフォームの値を挿入する.

という感じになります.

セル(正式にはClass Range)を取得するgetRange()の記法は,第一引数にrow第二引数にcolumnを入力するパターンと,A1Notation("A1", "B2"等)でとるやり方の2パターンがあります.

DataBaseのシートはどんどん挿入される場所が下に移動していくので,数字で扱いたく,db.getRange(nextRow, 1)のように書くのが適切だと考えられます.

それに対して,入力フォームのシートから欲しい値のある場所はいつでも不変なのでA1Notationの記法でform.getRange("A2")としました.

どのように作成を進めていったら宜しいのでしょうか?

基本的にはやりたいことをちゃんと固めて,それを元にコードを書くことになると思います.
自分がやりたい機能があるかどうかは,公式リファレンスを参考に実装していけば良さそうです.

また,Google Formもありますので,必ずしもスプレッドシートの形でなくても,Google Formで投稿させて,Google Spreadsheetに蓄積させる.みたいなこともできます.

2Like

Comments

  1. @hiroshi0410

    Questioner

    私の曖昧なご質問に対して本当にご丁寧にご回答いただきありがとうございます。
    非常に参考になりました。
    最初は模写からのスタートになりますが、自分で打ち込んで完成することができました。

    重ねての質問となり、恐縮ですが、
    スマートフォンのスプレッドシートで「登録」のボタンを押しても反応しません・・・
    何か良い方法はありませんでしょうか?
  2. @hiroshi0410

    Questioner

    db.getRange(nextRow, 1).setValue(form_money.getValue());
    form_money.clear(); // 金額欄form_moneyをclearで削除

    出力先のセルを指定する場合はどのように値を入れればよろしいでしょうか?
    現在はDataBaseの一番上のセルから順番に出力されています。

    例えばC5から出力などは可能でしょうか?
  3. > スマートフォンのスプレッドシートで「登録」のボタンを押しても反応しません・・・
    PC版ブラウザのみで登録ボタンが動きます.
    なので,スマートフォンで開かれているブラウザで,「PC版サイトをリクエスト」等の機能があると思うので,そちらを使っていただくしかないです.ただしPC版になるので縮尺がかなり見づらい上,扱いにくいものになります.
    どうしてもスマホからであればGoogle Formを使った入力か,自身でスマホアプリを作られるかの2択になると思います.

    > 出力先のセルを指定する場合はどのように値を入れればよろしいでしょうか?
    > 現在はDataBaseの一番上のセルから順番に出力されています。

    lastRowは何もない最初の行を指し示しています.
    一番最初に挿入する場合は`lastRow() + 4`で5行目に挿入されますが,二回目の挿入では,そこからさらに4行空く形になってしまい,条件分岐の処理が増えてしまいます.初心者には大変なことと思います.

    提案としては,4行目にタイトル等の何かを書いておくことで,`lastRow() + 1`のままで5行目から出力させるようにはできるようにしたほうが良さそうです.

    Cは左から3番目なので,getRange(nextRow, 3)になりますね.
  4. @hiroshi0410

    Questioner

    ありがとうございます!
    スマホではなかなか難しいのですね!
    仕事柄、出先が多くスマホで登録ができればよいと思いましたが・・

    出力先の件、承知いたしました。
    タイトルを作成してみます!
    迅速なご対応ありがとうございます。
  5. @hiroshi0410

    Questioner

    =QUERY({S12:AG306;BA12:BO149;AJ12:AX24;BR12:CF25},"where Col5 is not null")

    クエリ関数での質問ですが、ここから昇順をかける場合はどうしたらよいでしょうか?
    出力先のデータでフィルタをかけるとデータが消えてしまします・・・
  6. 如何せんコードを書くのには慣れているのですがどうもスプレッドシートには弱く,QUERY関数で昇順ソートをかけるには`order by <昇順にしたい列> asc`であることぐらいしかわからないです.

    一旦,本質問をクローズにしていただいた上で新しい質問を立てていただいて,
    この質問からの継続でクエリ関数の質問をしたい旨を記述していただけるとありがたいです.
  7. @hiroshi0410

    Questioner

    承知いたしました。
    様々なご対応ありがとうございます。

Your answer might help someone💌