teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

回答を追記しました

2018/08/09 11:20

投稿

hot-lemoned
hot-lemoned

スコア63

answer CHANGED
@@ -114,4 +114,161 @@
114
114
  あ… それとも月末とかにまとめて請求書発行するのであれば、別にフラグ関係なかったか…orz
115
115
 
116
116
  いかがでしょうか?
117
- まだ勉強中の身のため説明が下手ですいません。。。
117
+ まだ勉強中の身のため説明が下手ですいません。。。
118
+
119
+ ---
120
+ ### 追記(2018/08/09)
121
+
122
+ 複数のスプレッドシートが作成できるようにしてみました。
123
+
124
+ 格納作業のところで、顧客名ごとにデータをまとめる作業をしました。
125
+ もう少し効率のよい書き方があると思います。。。
126
+
127
+ データ発行処理のところで、顧客名ごとにスプレッドシートを作成しています。
128
+ GASに問い合わせする回数を減らすのがいずれもポイントなんだと思います。
129
+
130
+ 簡単なテストしかしていないので適宜修正してください。
131
+
132
+ ```GAS
133
+ function myfunction() {
134
+ Logger.log('--処理開始--');
135
+
136
+ /*基本設定*/
137
+ var tmplId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";   //テンプレートIDの定義
138
+ var dstDirId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";  //保存先IDの定義
139
+
140
+ /*コピー処理*/
141
+ var tmpl = DriveApp.getFileById(tmplId);    //テンプレートIDからデータを取得
142
+ var dstDir = DriveApp.getFolderById(dstDirId); //IDからフォルダの場所を取得
143
+ var ss_act = SpreadsheetApp.getActiveSpreadsheet(); //アクティブなシートを取得
144
+
145
+ var ss_copyFrom = ss_act.getSheetByName('合算');   //アクティブなシート内の「合算」タブ内を参照
146
+ var LR_ssf = ss_copyFrom.getLastRow();
147
+ var Data = ss_copyFrom.getDataRange().getValues();
148
+ var n = 1;
149
+
150
+ //Logger.log(Data);
151
+
152
+ /*格納作業*/
153
+ var strage_userinfo = [];
154
+ for(var i=1; i < LR_ssf; i++){
155
+ if(Data[i][6] == '発行'){
156
+ //条件分岐用:明細発行有無
157
+ if(strage_userinfo.length > 0){
158
+ //配列に1つ以上顧客情報がある
159
+ for(var a=0; a < strage_userinfo.length; a++){
160
+ var search_name = strage_userinfo[a].indexOf(Data[i][1]);
161
+ if(search_name >=0){
162
+ //顧客名が見つかった
163
+ var strage_data = [
164
+ Data[i][18], //内容
165
+ Data[i][19], //単価
166
+ Data[i][20], //数量
167
+ Data[i][21] //合計
168
+ ];
169
+ strage_userinfo[a][5].push(strage_data);
170
+ break;
171
+
172
+ }else if(search_name == -1){
173
+ //顧客名見つからない
174
+ if(a+1 == strage_userinfo.length){
175
+ //配列内には顧客名なし
176
+ var user_array =[
177
+ Data[i][1], //顧客名
178
+ Data[i][2], //郵便番号
179
+ Data[i][3], //住所
180
+ Data[i][4], //建物名等
181
+ Data[i][7], //敬称
182
+ []
183
+ ];
184
+ var strage_data = [
185
+ Data[i][18], //内容
186
+ Data[i][19], //単価
187
+ Data[i][20], //数量
188
+ Data[i][21] //合計
189
+ ];
190
+ user_array[5].push(strage_data);
191
+ strage_userinfo.push(user_array);
192
+ break;
193
+ }
194
+ }
195
+ }
196
+
197
+ }else{
198
+ Logger.log("配列なし");
199
+ //配列の中身が存在していない
200
+ var user_array =[
201
+ Data[i][1], //顧客名
202
+ Data[i][2], //郵便番号
203
+ Data[i][3], //住所
204
+ Data[i][4], //建物名等
205
+ Data[i][7], //敬称
206
+ []
207
+ ];
208
+ var strage_data = [
209
+ Data[i][18], //内容
210
+ Data[i][19], //単価
211
+ Data[i][20], //数量
212
+ Data[i][21] //合計
213
+ ];
214
+ user_array[5].push(strage_data);
215
+ strage_userinfo.push(user_array);
216
+ }
217
+ }
218
+ }
219
+ //Logger.log(strage_userinfo);
220
+
221
+ /*データ発行処理*/
222
+ for(var v=0; v < strage_userinfo.length; v++){
223
+ Logger.log("--" + (v+1) +"枚目の処理--");
224
+ //スプレッドシートのコピー
225
+ var invoice = tmpl.makeCopy(strage_userinfo[v][0],dstDir);   //指定フォルダにデータを作成し名称をB2から↓(i,2)の値とする。
226
+
227
+ //転記シート処理
228
+ var sst = SpreadsheetApp.open(invoice);        //作成済みデータ開く
229
+ var t_sheets = sst.getSheets();             //sheetsの値を定義
230
+ var t_sheet = t_sheets[0];                //作成済みファイルは1シートしかないので0番目を取得
231
+
232
+ //顧客情報
233
+ var invoice_inforange = t_sheet.getRange('A1:I21');
234
+ var invoice_infoset = invoice_inforange.getValues();
235
+
236
+ invoice_infoset[0][1] = ('〒'+strage_userinfo[v][1]); //B1:郵便番号 を代入
237
+ invoice_infoset[1][1] = (strage_userinfo[v][2]); //B2:住所を代入
238
+ invoice_infoset[2][1] = (strage_userinfo[v][3]); //B3:建物名等を代入
239
+ invoice_infoset[4][1] = (strage_userinfo[v][0]); //B5:送付先名称を代入
240
+ invoice_infoset[4][3] = (strage_userinfo[v][4]); //D5:敬称を代入
241
+ invoice_infoset[0][8] = ("001"); //I1:請求IDを代入*ここどうしようか悩んでます。
242
+ invoice_infoset[20][2] = (strage_userinfo[v][0]); //C21:件名を代入
243
+
244
+ /*
245
+ var dt = new Date(); //現在の日付を取得
246
+ var y = dt.getFullYear();
247
+ var m = ("00" + (dt.getMonth()+1)).slice(-2);
248
+ var d = ("00" + dt.getDate()).slice(-2);
249
+ var today = y + "/" + m + "/" + d;
250
+ */
251
+ var today = new Date();
252
+ invoice_infoset[1][8] = (today); //I2:本日を代入
253
+
254
+ //出力データ
255
+ var invoice_datarange = t_sheet.getRange(27, 2, strage_userinfo[v][5].length, 8);
256
+ var invoice_dataset = invoice_datarange.getValues();
257
+ for(var t=0; t < invoice_dataset.length; t++){
258
+ invoice_dataset[t][0] = (strage_userinfo[v][5][t][0]); //B27:内容を代入
259
+ invoice_dataset[t][4] = (strage_userinfo[v][5][t][1]); //F27:単価を代入
260
+ invoice_dataset[t][6] = (strage_userinfo[v][5][t][2]); //H27:数量を代入
261
+ invoice_dataset[t][7] = (strage_userinfo[v][5][t][3]); //I27:合計を代入
262
+ }
263
+ //Logger.log(invoice_dataset);
264
+
265
+ //顧客情報を転記シートに記入
266
+ invoice_inforange.setValues(invoice_infoset);
267
+ //出力データを転記シートに記入
268
+ invoice_datarange.setValues(invoice_dataset);
269
+ Logger.log("--" + (v+1) +"枚目の処理終了--");
270
+ }
271
+
272
+ Logger.log('--処理終了--');
273
+ }
274
+ ```