スプレッドシートで朝、昼、夜の食事記録をつけたいです。
ただ、毎回のように「白米茶碗1杯」などとセルに入力していくのは面倒です。
白米茶碗1杯というオブジェクトを作り、以下のようなプロパティを設定します。
この、オブジェクトをドラッグなどしてセルに追加するという仕組みですが、可能でしょうか。
const whiteRice={ kcal:"250", protein:"4", salt:"0", }
他の食品のオブジェクトも1つのセルの中に配置し、その合計値を計算するという仕組みです。以下がスプレッドシートの画像ですが、どのような構造にしたら良いでしょうか?
スプレッドシートでは難しそうな感じです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
テンプレートの追加等がしたいならGASを使ってサイドバーにテンプレートの一覧を表示し、一覧の項目クリックで選択中セルにテキストを追加等するといいかもしれません。
興味が湧いたので軽く実装してみましたが、実用上は
- 選択セルが「朝・昼・夜」以外のみ動作するように制限する
- 重複登録のチェック
- 品目は別シートから読み込む
- その際栄養価も自動計算する
などをすると便利かもしれません。
JavaScript
1/** 2 * トリガー(スプレッドシートから - 起動時)から起動される処理。 3 */ 4function onOpenByTrigger(e) { 5 const ui = SpreadsheetApp.getUi(); 6 ui.createMenu("マクロ").addItem("サイドバー表示", "showSidebar").addToUi(); 7 showSidebar(); 8} 9 10/** 11 * サイドバーを表示する。 12 * スプレッドシート起動時 または メニューから起動される。 13 */ 14function showSidebar() { 15 const template = HtmlService.createTemplateFromFile("Panel"); 16 template.items = ["白米茶碗1杯", "卵1個", "納豆半分", "キャベツ1/5"]; 17 const output = template.evaluate().setTitle("食事品目の追加"); 18 19 const ui = SpreadsheetApp.getUi(); 20 ui.showSidebar(output); 21} 22 23/** 24 * 引数で受け取ったテキストを選択中のセルに追加する。 25 * サイドバーに表示したHTMLから呼ばれる。 26 * @param {string} addingText 27 */ 28function addText(addingText) { 29 const sheet = SpreadsheetApp.getActiveSheet(); 30 const range = sheet.getCurrentCell(); 31 let text = range.getValue() || ""; 32 if (text !== "") text += "\n"; 33 text += addingText; 34 range.setValue(text); 35}
HTML
1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 <script> 6 document.addEventListener("DOMContentLoaded", () => { 7 const ondblclick = e => { 8 const addingText = e.currentTarget.textContent; 9 google.script.run 10 .withFailureHandler(err => alert(err.message)) 11 .addText(addingText); 12 }; 13 document.querySelectorAll("option") 14 .forEach(option => option.addEventListener("dblclick", ondblclick)); 15 }); 16 </script> 17 </head> 18 <body> 19 <select size="<?=items.length?>" style="width:100%"> 20 <? for(const item of items) { ?> 21 <option value="<?=item?>"><?=item?></option> 22 <? } ?> 23 </select> 24 </body> 25</html>
投稿2021/06/08 12:03
総合スコア2577
0
タイトルの「スプレッドシートでセルの値をオブジェクト化し、プロパティをもたせる事はできるでしょうか?」は、具体的な内容が判然としませんが、その内容によっては可能だと思います。
しかし本文の「オブジェクトをドラッグなどしてセルに追加するという仕組みですが、可能でしょうか。」という問いについて、この「オブジェクト」を「図形のようなもの」と解釈するならば、図形のドラッグ等を検知する仕組みがGoogle Spreadsheetには存在しないため、不可能です。
(Google Spreadsheetでは、シート状に配置した図形のクリックは検知できますが、スクリプト上でドラッグ開始の検知や移動中の図形の位置把握やマウスアップの検知はできません)
投稿2021/06/08 10:28
編集2021/06/08 10:29退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
Google apps scriptを使用したことがない場合、説明が難しいかもしれないので、
vlookup関数を使用する方法を考えていました。
2 元のシートのB2を右クリック→ データの入力規則→ リストを範囲で指定 → 項目シートのA列を選びます。
「='項目'!$A$2:$A」
これでデータの選択は簡単になりました。
昼と夜の列も同様にします。
3 朝昼夜の食事があるので、元のシートのBCD列の右に3列「kcal,protein,salt」挿入します。
4
挿入されたC列のkcalの列には、 =iferror(VLOOKUP($B2,'項目'!$A$2:$D$100,2,false),0) 挿入されたD列のproteinの列には、 =iferror(VLOOKUP($B2,'項目'!$A$2:$D$100,3,false),0) 挿入されたE列のsaltの列には、 =iferror(VLOOKUP($B2,'項目'!$A$2:$D$100,4,false),0)
昼と夜のkcal,protein,saltの列にも同様に入れます。
5 最後の3列は朝昼夜のそれらの合計にします。
その後の行は最初の行をコピーします。
コピーしたときに関数の参照先が正しいかご注意ください。
6 朝・昼・夜のkcalなどの列はグループ化して非表示にしておき、一日の合計のみ表示されるようにします。
投稿2021/06/08 09:33
総合スコア608
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。