Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : Microsoft 365)
Googleカレンダーから取得した予定リストからカレンダー作成
投稿日時: 22/12/04 20:02:07
投稿者: hhjpp

Googleカレンダー(複数人)から取得した予定リストをカレンダー形式で表示したいです。
現在の問題点:「リスト」にないものは空白になってしまうため該当の予定のみカレンダーに詰めて表示したい。
 
sheet:「リスト」Googleカレンダーから取得した予定リストを貼り付け
   A   B C    D     E   F    G     H
1           Project   Text Weekday  Date  Start time
2 44900_1_1 1 1 aaa@gmail.com 会議 月曜日 2022/12/05 13:00
下に続く
 
A列:=concatenate(G2,"_",B2,"_",C2)
B列:=countif($G$1:$G2,G2)
C列:=countifs($G$2:G2,G2,E$2:$E2,E2)
D〜HはGoogleカレンダーから自動で取得
※複数人のカレンダーから取得しているため重複するものは反映させないようにしてあります。
 
Sheet:「カレンダー」カレンダー形式の表になっています。
    A   B    C    D    E 
1行目     8    5    8    5
2行目   12/5(月)     12/6(火)
3行目 1  13:00   会議  10:00  外出
4行目 2           11:00  
5行目 3  13:00   研修
 
B3:=iferror(vlookup(concatenate(B$2,"_",$A3,"_"&1),リスト!$A:$H,B$1,0),"")
C3:=iferror(vlookup(concatenate(B$2,"_",$A3,"_"&1),リスト!$A:$H,C$1,0),"")
 
問題点を解決する方法と、予定一覧リストからカレンダーを作成する際にそもそもこの方法が最適なのか?他に良い方法があれば教えて頂きたいです。
よろしくお願いいたします。

回答
投稿日時: 22/12/04 23:29:43
投稿者: 半平太

Microsoft 365なら、Filter関数が使えます。
  
B3セル =LET(r,リスト!$E2:INDEX(リスト!$H:$H,COUNT(リスト!$G:$G)+1),SORTBY(FILTER(FILTER(r,INDEX(r,0,3)=B$2,{"","","",""}),{1,0,0,1}),{2,1}))
  
B3:C3を選択して、2セル一括右へフィルコピー(C3に数式は入っていない)
(注:下方へは、自動的にスピルしますので、コピー不要)
 

<カレンダー シート 結果図>
行  _A_  ___B___  __C__  ___D___  __E__  ___F___
 1                                              
 2       12月5日         12月6日         12月7日
 3         13:00  会議      9:00  研修          
 4         13:00  研修     10:00  外出          
 5         14:00  会議                          

<リスト シート サンプルデータ>
行 _A_ _B_ _C_ ______D______ __E__ ___F___ ____G____ _____H_____
 1             Project       Text  Weekday Date      Start time 
 2             aaa@gmail.com 会議  月曜日  2022/12/5       13:00
 3             aaa@gmail.com 研修  月曜日  2022/12/5       13:00
 4             aaa@gmail.com 会議  月曜日  2022/12/5       14:00
 5             aaa@gmail.com 研修  火曜    2022/12/6        9:00
 6             aaa@gmail.com 外出  火曜    2022/12/6       10:00

 

回答
投稿日時: 22/12/05 00:01:39
投稿者: んなっと

重複予定のうち2番目以降が空白行になっているところを、上に詰めて表示したいのですね。
 
●UNIQUE関数を使う方法
 
=LET(r,UNIQUE(リスト!$E2:$H500),CHOOSECOLS(FILTER(r,INDEX(r,,3)=B$2,""),4,1))
(半平太さんの式と同じような方法です)
 
●現在のような作業列を使う方法
 
リスト
A2
=IF(COUNTIFS($G$2:G2,G2,E$2:$E2,E2)=1,CONCATENATE(G2,"_",COUNTIF(A$1:A1,G2&"_*")+1),"")
 
カレンダー
B3
=IFERROR(VLOOKUP(CONCATENATE(B$2,"_",$A3),リスト!$A:$H,B$1,0),"")
C3
=IFERROR(VLOOKUP(CONCATENATE(B$2,"_",$A3),リスト!$A:$H,C$1,0),"")

回答
投稿日時: 22/12/05 07:56:29
投稿者: んなっと

修正。IFERRORが必要。
=LET(r,UNIQUE(リスト!$E2:$H500),IFERROR(CHOOSECOLS(FILTER(r,INDEX(r,,3)=B$2),4,1),""))

投稿日時: 22/12/06 09:34:25
投稿者: hhjpp

こんなに簡単に出来るとは…シートもとても見やすくなりました。勉強になります。
お二人共ありがとうございました。