回答編集履歴
10
追加
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
修正
test
CHANGED
@@ -218,7 +218,7 @@
|
|
218
218
|
|
219
219
|
* 戻り値:
|
220
220
|
|
221
|
-
* Range : 分割後の個別セル範囲
|
221
|
+
* Range[] : 分割後の個別セル範囲(Range)を格納した配列
|
222
222
|
|
223
223
|
*****************************************************/
|
224
224
|
|
8
修正
test
CHANGED
@@ -346,7 +346,7 @@
|
|
346
346
|
|
347
347
|
を探します。
|
348
348
|
|
349
|
-
![イメージ説明](ff
|
349
|
+
![イメージ説明](b28f36165578fa1067e0967ad2ae97cb.png)
|
350
350
|
|
351
351
|
|
352
352
|
|
7
修正
test
CHANGED
@@ -168,7 +168,7 @@
|
|
168
168
|
|
169
169
|
function getAddress(sheetObj, row, col) {
|
170
170
|
|
171
|
-
if (sheetObj
|
171
|
+
if (sheetObj == null) {
|
172
172
|
|
173
173
|
throw Error("引数 sheetObjが指定されていません。");
|
174
174
|
|
6
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
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
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~
|
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
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
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
追加
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
|
+
```
|