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

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

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

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

Q&A

解決済

3回答

899閲覧

スプレッドシートでセルの値をオブジェクト化し、プロパティをもたせる事はできるでしょうか?

blendegg

総合スコア81

Google スプレッドシート

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

0グッド

0クリップ

投稿2021/06/08 08:26

スプレッドシートで朝、昼、夜の食事記録をつけたいです。
ただ、毎回のように「白米茶碗1杯」などとセルに入力していくのは面倒です。
白米茶碗1杯というオブジェクトを作り、以下のようなプロパティを設定します。
この、オブジェクトをドラッグなどしてセルに追加するという仕組みですが、可能でしょうか。

const whiteRice={ kcal:"250", protein:"4", salt:"0", }

他の食品のオブジェクトも1つのセルの中に配置し、その合計値を計算するという仕組みです。以下がスプレッドシートの画像ですが、どのような構造にしたら良いでしょうか?
スプレッドシートでは難しそうな感じです。
イメージ説明

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

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

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

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

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

guest

回答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

draq

総合スコア2577

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

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

0

タイトルの「スプレッドシートでセルの値をオブジェクト化し、プロパティをもたせる事はできるでしょうか?」は、具体的な内容が判然としませんが、その内容によっては可能だと思います。

しかし本文の「オブジェクトをドラッグなどしてセルに追加するという仕組みですが、可能でしょうか。」という問いについて、この「オブジェクト」を「図形のようなもの」と解釈するならば、図形のドラッグ等を検知する仕組みがGoogle Spreadsheetには存在しないため、不可能です。
(Google Spreadsheetでは、シート状に配置した図形のクリックは検知できますが、スクリプト上でドラッグ開始の検知や移動中の図形の位置把握やマウスアップの検知はできません)

投稿2021/06/08 10:28

編集2021/06/08 10:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

blendegg

2021/06/08 10:51

図形のようなものをドラッグして追加していく仕組みですね。 ドラッグでなくとも、コンテキストやボタンからの追加でもいいです。 要は頻繁に使うテンプレートを簡単に追加したいのです。
guest

0

ベストアンサー

Google apps scriptを使用したことがない場合、説明が難しいかもしれないので、
vlookup関数を使用する方法を考えていました。

1 項目シートをつくります
イメージ説明

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

gas.engine

総合スコア608

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

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

blendegg

2021/06/08 21:32

ありがとうございます。gasは触ったことがないのですが、javascriptと似ていると思うのでこれをみてチャレンジします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問