回答編集履歴
1
回答を追記しました
    
        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 | 
            +
            ```
         | 
