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

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

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

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

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

1796閲覧

スプレッドシートで「キャンセル」と入ったら、データを削除or差し引きしたい(関数orGAS)

r_suzuki_SK

総合スコア2

Google スプレッドシート

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

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2021/07/31 10:27

編集2021/07/31 10:44

前提・実現したいこと

GoogleフォームとGoogleスプレッドシートで発注の管理をしています。
フォームでキャンセルにチェックして送信したら、以前発注したデータを削除、もしくは差し引きして発注が無かった状態にしたいです。

下記図の黄色く塗りつぶしているところがキャンセル入力してデータを取り消したい行になります。

▼シート名「シート1」:フォームの回答のシート
![イメージ説明]

◆制約
①F列(単価)から金額の合計を別のシートにSUMIFで算出しています
②D列(お弁当の種類を選択)から発注する個数を別のシートにCOUNTIFで算出しています

試したこと、考えた案

①B列に「キャンセル」と入ったら、F列の単価が*-1することはIF関数等で何とかできそうと思うのですが、D列のお弁当の種類を取り消す方法が思いついていません。

②GASで「removeDuplicates()」で重複している行を削除しようと思いましたが、1行しか削除されず、目的とは違いました。

関数での解決でもGASでの解決でも構いません。
何かいいアドバイスございましたら教えてくださるとありがたいです。

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

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

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

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

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

guest

回答2

0

解釈があっているかわかりませんが、GASを使った方法を提示してみます。
キャンセルされた場合、シートに表示されている一番近い同じ名前の人を、以前に注文したアイテムとして判断しました。
2種類のスクリプトを作ってみましたので、シートのバックアップをとり試してみてください。

D列のお弁当の種類を消します、F列の単価を0にします、列の色を黄色にします。

GAS

1function editCancelItems() { 2 let file = SpreadsheetApp.openById("シートのIDを記入してください。"); 3 let sheet = file.getSheetByName("シート1"); 4 5 let values = sheet.getRange("B2:C").getValues(); 6 let values_canceled = values 7 .map(function (v, i) { 8 if (v[0] === "キャンセル") { 9 var index = i + 2; 10 return { 11 cancel_name: v[1], 12 cancel_index: index, 13 }; 14 } else { 15 return false; 16 } 17 }) 18 .filter(function (v, i) { 19 return v; 20 }); 21 //console.log(values_canceled); 22 values_canceled.forEach(function (a, i) { 23 values.forEach(function (v, i) { 24 var index = i + 2; 25 if (v[0] !== "キャンセル" && v[1] === a.cancel_name && index < a.cancel_index) { 26 a.duplicate_index = index; 27 } 28 }); 29 }); 30 //console.log(values_canceled); 31 let remove_index = values_canceled 32 .map(function (a, i) { 33 return [a.cancel_index, a.duplicate_index]; 34 }) 35 .flat(); 36 remove_index.sort((a, b) => { 37 return b - a; 38 }); 39 remove_index = Array.from(new Set(remove_index)); 40 console.log(remove_index); 41 remove_index.forEach(function (index, i) { 42 sheet.getRange(`D${index}`).setValue(``); 43 sheet.getRange(`F${index}`).setValue(0); 44 sheet.getRange(`${index}:${index}`).setBackground(`yellow`); 45 }); 46}

列を削除するバージョンです。

GAS

1function removeCancelItems() { 2 let file = SpreadsheetApp.openById("シートのIDを記入してください。"); 3 let sheet = file.getSheetByName("シート1"); 4 5 let values = sheet.getRange("B2:C").getValues(); 6 let values_canceled = values 7 .map(function (v, i) { 8 if (v[0] === "キャンセル") { 9 var index = i + 2; 10 return { 11 cancel_name: v[1], 12 cancel_index: index, 13 }; 14 } else { 15 return false; 16 } 17 }) 18 .filter(function (v, i) { 19 return v; 20 }); 21 //console.log(values_canceled); 22 values_canceled.forEach(function (a, i) { 23 values.forEach(function (v, i) { 24 var index = i + 2; 25 if (v[0] !== "キャンセル" && v[1] === a.cancel_name && index < a.cancel_index) { 26 a.duplicate_index = index; 27 } 28 }); 29 }); 30 //console.log(values_canceled); 31 let remove_index = values_canceled 32 .map(function (a, i) { 33 return [a.cancel_index, a.duplicate_index]; 34 }) 35 .flat(); 36 remove_index.sort((a, b) => { 37 return b - a; 38 }); 39 remove_index = Array.from(new Set(remove_index)); 40 console.log(remove_index); 41 remove_index.forEach(function (index, i) { 42 //Utilities.sleep(5000); 43 sheet.deleteRow(index); 44 }); 45} 46

投稿2021/08/02 18:48

fake_shibe

総合スコア806

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

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

r_suzuki_SK

2021/08/03 05:12 編集

回答ありがとうございます。 前に回答してくださった方で自分なりに作ってみて解決してしまいましたが、GASも勉強したいと思っていましたので、とてもありがたいです! 詳しく2パターンの提示ありがとうございます。 こちらのパターンでも作成してみて勉強させていただきます。 ありがとうございました!
guest

0

ベストアンサー

【スクリプトを使わず、関数だけを使用する方法】

ここではフォームからの回答を集約しているシートの名前が、「シート1」という名前であると仮定します。

シート1に新たに「個数」という名前の列を追加し、
その列の2行目に下記の式を入力します。(下図のH列)
(注意)「個数」の列はスプレッドシートだけに追加すればよく、アンケートに追加する必要はありません。

text

1=ARRAYFORMULA(IF(D2:D<>"", IF(B2:B="キャンセル", -1, 1), ""))

イメージ説明

これは
「お弁当の種類(D列)を選択済みかつキャンセル列(B列)が空白でないならば 1、
お弁当の種類を選択済みかつキャンセル列に"キャンセル"という文字列がある場合は -1、
お弁当の種類列が空白の場合(回答されていない行)は 空白」
という意味です。

次に、お弁当の種類ごとの数を集計するシートに、下記のような式を入れます。

text

1=QUERY(QUERY('シート1'!A2:H, "SELECT D, SUM(H) GROUP BY D LABEL SUM(H) ''"), "WHERE Col1 <> ''")

イメージ説明

これでお弁当の種類ごとに、キャンセルを除いた個数が集計表示されます。

QUERYが2つある理由:
後半のQUERYだけだと、Hが空白となっている行も集計表示されてしまいます。
そこで、後半のQUERYで抽出した結果のうち1列目が空白のものを前半のQUERYで除外して表示しています。

投稿2021/08/01 05:59

編集2021/08/01 05:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

r_suzuki_SK

2021/08/03 05:47 編集

回答ありがとうございます、qnoirさんのおかげで無事解決できました。 個数でカウントすれば発注個数がカウントできますね! また<>がノットイコールだと初めて知りました。 とても勉強になりました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問