前提・実現したいこと
GoogleフォームとGoogleスプレッドシートで発注の管理をしています。
フォームでキャンセルにチェックして送信したら、以前発注したデータを削除、もしくは差し引きして発注が無かった状態にしたいです。
下記図の黄色く塗りつぶしているところがキャンセル入力してデータを取り消したい行になります。
◆制約
①F列(単価)から金額の合計を別のシートにSUMIFで算出しています
②D列(お弁当の種類を選択)から発注する個数を別のシートにCOUNTIFで算出しています
試したこと、考えた案
①B列に「キャンセル」と入ったら、F列の単価が*-1することはIF関数等で何とかできそうと思うのですが、D列のお弁当の種類を取り消す方法が思いついていません。
②GASで「removeDuplicates()」で重複している行を削除しようと思いましたが、1行しか削除されず、目的とは違いました。
関数での解決でもGASでの解決でも構いません。
何かいいアドバイスございましたら教えてくださるとありがたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア806
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/03 05:12 編集