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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

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

Q&A

解決済

2回答

2532閲覧

GASで請求書の作成 同じ品名を並べて書きたい場合

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

0グッド

0クリップ

投稿2019/02/25 16:20

こんにちは!

顧客データスプレッドシートを元に、所定のスプレッドシート(請求書フォーマット)へ転記し請求書を自動で生成しようと考えています。
1項目毎データを取得し、請求書フォーマットシートに置換していくことはできました。しかし、ある顧客は複数品名があるため、請求書の品名も同様に複数記載する必要がでてきました。

そこで以下のように社名だけ重複させて品名分行を追加した元データを用意しました。

顧客データスプレッドシート

会社名品名価格
A会社みかん100円
A会社りんご200円
B会社ばなな300円
B会社すもも400円

このデータを元に、A会社の場合は、請求書スプレッドシートの品名から下にあるだけ並べて転記したいのですがどのようにしたらいいかわかりません。

A会社・請求書スプレッドシート

品名価格
みかん100円
りんご200円

そもそも顧客データをこのようなフォーマットで用意すべきかもよくわからないのですが、
アドバイスいただけると助かります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

請求書スプレッドシートの品名・金額を書く欄の左上(品名欄の最上部)に↓と書けばよいように思います。

=QUERY('顧客データ'!A:C, "SELECT B,C WHERE A = 'A社'")

投稿2019/02/26 03:53

papinianus

総合スコア12705

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

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

papinianus

2019/02/26 07:47

function myFilter(sheet, keyWord) { return sheet.getDataRange().getValues().filter(function(e) { return e[0] === keyWord;}).map(function(e) { return [e[1],e[2]];}); }
退会済みユーザー

退会済みユーザー

2019/02/27 03:28

ありがとうございます。こちらはシンプルでわかりやすいですね! そもそもQueryが利用できるということを知らず、データを配列にしてテンプレートに書き込むしかできないのだとおもっておりました。 早速手元の環境で実行してみたのですが、2点ほど不明点がでてきました。 1:結合セルの扱い =QUERY('顧客データ'!A:C, "SELECT B,C WHERE A = 'A社'") という式を結合したセルに入力すると品名列しか表示されません。※結合されてないセルだと普通に表示されます。統合されたセルがある場合Queryの構文で調整するようなことはできるのでしょうか。 2:最初の1行目の文字が表示されてしまう。 QUERYで参照させますと、請求テンプレートのセルに品名 価格 という風に1行目の内容が表示されます。こちらの文字を消すためにLabelを利用して以下のように記載してみると文字は消えたのですが空白のセルだけが残ります。 =QUERY('顧客データ'!A:C, "SELECT B,C WHERE A = 'A社' label B ``") Queryを記載したセルからいきなり品名で始まるようにする方法が調べても出てきませんでした。
papinianus

2019/02/27 05:23

1:結合セルの扱い どこが結合しているのでしょうか? 転記元:横結合している場合、もっとも左のセルに値が保存されていますので、Select B, Dなどとすれば、結合したさらに右の値は取れるはず 転記先:結合したセルにはデータは1つか入れられません。関数を使えば連結できるのかもしれませんが存じません 2:最初の1行目の文字が表示されてしまう。 結合やフィルタを設定するなども試しましたがラベルを置かなくても品名は出ません。現象の再現のさせかたがわかりません。A="A社"としているのに、A列="品名"のものが出てくるのであれば、A列="B社"がでてこない理由がわからないです。 結合含め、質問にないことが出てきてますので、どことどこがどうなっているかという具体的な仕様を質問に開示して、もっと困っている状況に即応した回答が得られるようにしたほうがいいと思います。
papinianus

2019/02/27 05:27

案として出ているmyFilterを上手く設計すれば、セルに`=myFilter(A1)`(A1セルにA社と書いているとする)と書くだけで、queryを使わなくても展開されるように作ることも可能ですが、いずれにしても具体的なシートの状態(結合や見出しの状態)が分からないと"上手く設計"ができません。
guest

0

常にシートと連動してデータが転機されている状態にするのなら、papinianusの回答の通りでスッキリ解決するかと思います。(毎回setFormulaで関数をセルにぶち込むほうが動きはわかりやすいと思いますので)
そうではなく、月度データを取得して請求データを作成する一連動きをGASでさせるための要素としての質問であれば、以下をご活用ください。(3列のデータに対して対象シートと検索ワードを指定して、1列目が一致する行の2列目、3列目を配列で返します。)

GAS

1function myFilter(sheet,keyWord) { 2 var datarange = sheet.getDataRange().getValues(); 3 var lastrow = sheet.getLastRow(); 4 var dataarry = sheet.getRange(2,1,lastrow,1).getValues(); 5 var data =Array.prototype.concat.apply([], dataarry); 6 7 var Rownumber = data.indexOf(keyWord); 8 var newarray = []; 9 10 while(Rownumber >= 0){ 11 var anser1 = datarange[Rownumber+1][1]; 12 var anser2 = datarange[Rownumber+1][2]; 13 newarray.push([anser1,anser2]); 14 Rownumber = data.indexOf(keyWord,Rownumber+1); 15 } 16 17 return newarray; 18}

投稿2019/02/26 07:41

hiroshi0240

総合スコア640

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

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

退会済みユーザー

退会済みユーザー

2019/02/27 03:08

ありがとうございます。すごくわかりやすい内容でした。 手元のサンプルで動作させてみたところ、無事会社名に連携した品名が配列に格納されておりました。 データが少し多いようで実データをつかってテストしてみたいとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問