回答編集履歴

10

追加

2021/10/10 14:14

投稿

退会済みユーザー
test CHANGED
@@ -338,6 +338,8 @@
338
338
 
339
339
  ・アクティブセルの1つ前の列の1行目は「`2021.7`」
340
340
 
341
+ ![イメージ説明](b28f36165578fa1067e0967ad2ae97cb.png)
342
+
341
343
  なので、
342
344
 
343
345
  **シート9**の中から、
@@ -346,8 +348,6 @@
346
348
 
347
349
  を探します。
348
350
 
349
- ![イメージ説明](b28f36165578fa1067e0967ad2ae97cb.png)
350
-
351
351
 
352
352
 
353
353
  そうすると、該当するのは13行目なので、シート9の13行目のデータが シート9の150行目に展開されます。
@@ -449,3 +449,187 @@
449
449
  }
450
450
 
451
451
  ```
452
+
453
+
454
+
455
+ -----
456
+
457
+ # コメントでの追加質問に対する回答
458
+
459
+ > 、上記のシート1に相当するピボットテーブルのシートが複数あり、その際switch case break構文を使えば良いと教えていただいたのですが、上記コードにこれを組み込むにはどうすればよろしいでしょうか?(仮にシート2として表の位置は1行目D列に枠があると仮定していただけますと幸いです、これで私の思うものが完成する次第です)
460
+
461
+
462
+
463
+
464
+
465
+ シートごとに処理を変える場合の例です
466
+
467
+ (共通処理として出せる部分は多々あるかと思いますが、「各シートの処理で具体的にどのような差異があるのか」について全く明記されていない以上、こちらでは回答できかねます。
468
+
469
+ 下記は共通処理も重複して書くことで、最低限動くであろうという例となります)
470
+
471
+ ```
472
+
473
+ // メニュー追加処理
474
+
475
+ function onOpen() {
476
+
477
+ var ui = SpreadsheetApp.getUi();
478
+
479
+ var menu = ui.createMenu('script');
480
+
481
+ menu.addItem('仕訳呼出', 'onClickMenu');
482
+
483
+ menu.addToUi();
484
+
485
+ }
486
+
487
+
488
+
489
+ // メニューをクリックしたときに実行
490
+
491
+ function onClickMenu() {
492
+
493
+ var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
494
+
495
+ switch (sheet.getName()){
496
+
497
+ case "シート1":
498
+
499
+ myFunctionSheet1(sheet)
500
+
501
+ break;
502
+
503
+
504
+
505
+ case "シート2":
506
+
507
+ myFunctionSheet2(sheet)
508
+
509
+ break;
510
+
511
+
512
+
513
+ case "シート3":
514
+
515
+ myFunctionSheet3(sheet)
516
+
517
+ break;
518
+
519
+
520
+
521
+ default: //上記以外の場合は何もしない
522
+
523
+ return;
524
+
525
+ }
526
+
527
+ // 以下に各シート共通処理を書く。
528
+
529
+ // ....
530
+
531
+ }
532
+
533
+
534
+
535
+
536
+
537
+ // シート1の処理コード
538
+
539
+ function myFunctionSheet1(sheet) {
540
+
541
+ var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート9');
542
+
543
+
544
+
545
+ // 展開先の行番号(例:150目以降に展開したい場合「150」を指定)
546
+
547
+ var OUTPUT_START = 150;
548
+
549
+ ....
550
+
551
+ ~~以下略~~(シート1専用の処理)(中身は上記のコード中のmyFunctionXYを参考に書けばよい)
552
+
553
+ ....
554
+
555
+ }
556
+
557
+
558
+
559
+ // シート2のコード
560
+
561
+ function myFunctionSheet2(sheet) {
562
+
563
+ var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート9');
564
+
565
+
566
+
567
+ // 展開先の行番号(例:150目以降に展開したい場合「150」を指定)
568
+
569
+ var OUTPUT_START = 150;
570
+
571
+ ....
572
+
573
+ ~~略~~(シート2専用の処理)
574
+
575
+ //「1行目D列に枠がある」->where節の読み取り列を3から4に変えればよい(?)
576
+
577
+ sheet2.getRange(lastRow, 1).setValue(
578
+
579
+ `=query('シート9'!A2:U${OUTPUT_START - 1},`
580
+
581
+ + `"where (D='"&${getAddress(sheet, rangeList[i].getRow() - 1 + 1, 4)}&"'`
582
+
583
+ + ` or L='"&${getAddress(sheet, rangeList[i].getRow() - 1 + 1, 4)}&"')`
584
+
585
+ + ` and year(A)="&text(substitute(substitute(${getAddress(sheet, 1, rangeList[i].getColumn() - 1)},"-",""),",","-"),"YYYY")&"`
586
+
587
+ + ` and month(A)+1="&text(substitute(substitute(${getAddress(sheet, 1, rangeList[i].getColumn() - 1)},"-",""),",","-"),"MM")&"")`);
588
+
589
+ ~~以下略~~
590
+
591
+ }
592
+
593
+ }
594
+
595
+
596
+
597
+ // シート3のコード
598
+
599
+ function myFunctionSheet3(sheet) {
600
+
601
+ var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート9');
602
+
603
+
604
+
605
+ // 展開先の行番号(例:150目以降に展開したい場合「150」を指定)
606
+
607
+ var OUTPUT_START = 150;
608
+
609
+ ....
610
+
611
+ ~~略~~(シート3専用の処理)
612
+
613
+ }
614
+
615
+ }
616
+
617
+
618
+
619
+
620
+
621
+ function getAddress(sheetObj, row, col) {
622
+
623
+
624
+
625
+ }
626
+
627
+
628
+
629
+ function getSprittedRange(rangelist) {
630
+
631
+
632
+
633
+ }
634
+
635
+ ```

9

修正

2021/10/10 14:14

投稿

退会済みユーザー
test CHANGED
@@ -218,7 +218,7 @@
218
218
 
219
219
  * 戻り値:
220
220
 
221
- * Range : 分割後の個別セル範囲
221
+ * Range[] : 分割後の個別セル範囲(Range)を格納した配列
222
222
 
223
223
  *****************************************************/
224
224
 

8

修正

2021/10/10 04:52

投稿

退会済みユーザー
test CHANGED
@@ -346,7 +346,7 @@
346
346
 
347
347
  を探します。
348
348
 
349
- ![イメージ説明](ff6a62463130d3d623b264b61941bdda.png)
349
+ ![イメージ説明](b28f36165578fa1067e0967ad2ae97cb.png)
350
350
 
351
351
 
352
352
 

7

修正

2021/10/10 04:41

投稿

退会済みユーザー
test CHANGED
@@ -168,7 +168,7 @@
168
168
 
169
169
  function getAddress(sheetObj, row, col) {
170
170
 
171
- if (sheetObj < 1) {
171
+ if (sheetObj == null) {
172
172
 
173
173
  throw Error("引数 sheetObjが指定されていません。");
174
174
 

6

2021/10/10 04:35

投稿

退会済みユーザー
test CHANGED
@@ -14,8 +14,6 @@
14
14
 
15
15
  現状のQUERYを使った数式と同じ動作をGASで実装することも可能ですが、この場合は、まず「どのような動作にしたいのか」をしっかり固める必要があると思います。
16
16
 
17
- (組んだ後で「実は本当はこういう動作がしたい」「うまく動かない」等言われても、また一からやり直しになってしまいます)
18
-
19
17
 
20
18
 
21
19
  QUERYを使った「数式」を汎用的に「GASのコード」に変える手段はおそらく存在せず、結局「やりたい動作」を行うために個別にカスタマイズせざるを得ません。

5

2021/10/10 04:34

投稿

退会済みユーザー
test CHANGED
@@ -12,15 +12,17 @@
12
12
 
13
13
   
14
14
 
15
- 現状のQUERYを使った数式と同じ動作をGASで実装することも可能ですが、まず「どのような動作にしたいのか」を固めた上でなと、同等の動作を組むことはできせん
15
+ 現状のQUERYを使った数式と同じ動作をGASで実装することも可能ですが、この場合は、まず「どのような動作にしたいのか」をしっかり固める必要があると思いま
16
+
16
-
17
+ (組んだ後で「実は本当はこういう動作がしたい」「うまく動かない」等言われても、また一からやり直しになってしまいます)
17
-  
18
-
18
+
19
+
20
+
19
- QUERYを使った数式を汎用的にGASのコードに変える手段はく、結局「やりたい動作」を行うため個別カスタマイズせざるを得ません。
21
+ QUERYを使った数式を汎用的にGASのコードに変える手段はおそら存在せず、結局「やりたい動作」を行うため個別カスタマイズせざるを得ません。
20
-
21
-
22
-
22
+
23
+
24
+
23
-  数式を使っていれば、質問者さんの方でカスタマイズも容易であると考えました。
25
+ 数式を使っていれば、質問者さんの方でカスタマイズも容易であると考えました。
24
26
 
25
27
 
26
28
 

4

2021/10/10 04:31

投稿

退会済みユーザー
test CHANGED
@@ -300,7 +300,7 @@
300
300
 
301
301
 
302
302
 
303
- シート1のデータ範囲のセルをクリックし、実行ボタンをクリックすると、下記の動作を行います。
303
+ シート1のデータ範囲のセルを1個以上クリックした状態で、実行ボタンをクリックすると、下記の動作を行います。
304
304
 
305
305
 
306
306
 
@@ -308,7 +308,7 @@
308
308
 
309
309
  (2)シート1 のアクティブなセルの**1つ前の列の1行目**にある年月値(「`2021,***`」)を読み取ります。
310
310
 
311
- (3)シート9 の A1~A149 の範囲から、**下記の条件**にあてはまる行を抽出、シート9の150行目以降に展開します。
311
+ (3)シート9 の A1~L149 の範囲から、**下記の条件**にあてはまる行を抽出する数式を、シート9の150行目以降に入力します。
312
312
 
313
313
  ```text
314
314
 
@@ -322,7 +322,13 @@
322
322
 
323
323
  ```
324
324
 
325
-
325
+ (4)クリックしたセルが複数ある場合は、残りのセルに対して同じ動作を順次繰り返します。
326
+
327
+ それぞれのセルについて検索結果が見つかった場合は、シート9の既存の結果行から1行空けて数式を追記します。
328
+
329
+  
330
+
331
+  
326
332
 
327
333
  # 例
328
334
 

3

2021/10/10 04:26

投稿

退会済みユーザー
test CHANGED
@@ -390,6 +390,12 @@
390
390
 
391
391
  ```
392
392
 
393
+ 上記コード内のgetAddress()関数は、これを拡張し、
394
+
395
+ シートオブジェクト・行番号・列番号を与えると、対応する「シート名!A1」形式の文字列を返す関数としています。
396
+
397
+
398
+
393
399
 
394
400
 
395
401
  ・**隣接するセルを選択したときのセル分割**

2

2021/10/10 04:10

投稿

退会済みユーザー
test CHANGED
@@ -34,6 +34,12 @@
34
34
 
35
35
  (動作検証環境:Windows 10 /Chromium Edge/GAS:V8エンジン有効)
36
36
 
37
+
38
+
39
+ シート9の展開先開始行を変えたい場合は、コード中の`OUTPUT_START`の数字を変えて保存・実行してください。
40
+
41
+  
42
+
37
43
  ```js
38
44
 
39
45
  function myFunctionXY() {

1

追加

2021/10/10 04:05

投稿

退会済みユーザー
test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  ・具体的な動作が読解し切れていないので、期待する動作と異なる部分があるかもしれませんが、御了承ください。
34
34
 
35
-
35
+ (動作検証環境:Windows 10 /Chromium Edge/GAS:V8エンジン有効)
36
36
 
37
37
  ```js
38
38
 
@@ -347,3 +347,87 @@
347
347
  複数の結果がある場合は1行ずつ空けて表示します。(下記はサンプルです)
348
348
 
349
349
  ![イメージ説明](e74dcaa5cc67f09d835aeaa1f7f7059b.png)
350
+
351
+
352
+
353
+ ---
354
+
355
+ # 補足
356
+
357
+ ・**別シートのセル値取得**
358
+
359
+ スプレッドシート上の数式で、同じスプレッドシート上の**別シート**のセル値を読み取る場合、indirect関数を使用する必要はありません。
360
+
361
+ 単純に`'シート名'!セル番地` とすれば指定したシートの指定した番地の値を取得できます。
362
+
363
+  
364
+
365
+  
366
+
367
+ ・**GAS内で、指定した行・列から、A1セル形式に変更する手段**
368
+
369
+ [getA1Notation() という関数](https://developers.google.com/apps-script/reference/spreadsheet/range#geta1notation)を使うことで、A1セル形式の文字列に変換できます。
370
+
371
+ ```
372
+
373
+ var ss = SpreadsheetApp.getActiveSpreadsheet();
374
+
375
+ var sheet = ss.getSheets()[0];
376
+
377
+ var range = sheet.getRange(2, 5);
378
+
379
+
380
+
381
+ Logger.log(range.getA1Notation());
382
+
383
+ // "E2"
384
+
385
+ ```
386
+
387
+
388
+
389
+ ・**隣接するセルを選択したときのセル分割**
390
+
391
+ Googleスプレッドシートの仕様として、隣接するセルをControlクリックで複数選択すると、1つのセルとして扱われてしまうことがあります。(少なくとも Windows10上のChromium Edgeではそうなっています)
392
+
393
+
394
+
395
+ 上記コードのgetSprittedRange()関数は、これを個別のセルに分割する関数です。
396
+
397
+ ```
398
+
399
+ function getSprittedRange(rangelist) {
400
+
401
+ // 戻り値(個別セル範囲)を格納するための配列
402
+
403
+ const output = [];
404
+
405
+ for (const range of rangelist.getRanges()) {
406
+
407
+ // RangeList が連続したセルの場合は、個別セル範囲に分割してoutput配列に追加
408
+
409
+ if (range.getHeight() != 1 || range.getWidth() != 1) {
410
+
411
+ for (let i = 1; i <= range.getHeight(); i++) {
412
+
413
+ for (let j = 1; j <= range.getWidth(); j++) {
414
+
415
+ output.push(range.getCell(i, j));
416
+
417
+ }
418
+
419
+ }
420
+
421
+ } else {
422
+
423
+ output.push(range);
424
+
425
+ }
426
+
427
+ }
428
+
429
+ return output;
430
+
431
+ }
432
+
433
+ ```