tamaoのoutput

output用

【PA】Teamsアダプティブカードで勤怠フォーム作成

定時にアダプティブカードを投稿して、
在宅勤務の勤怠登録フォームをつくった。

2024/12/03
だいたい出来たが、フォーム送信後の動的なアクションが表示されない。

原因?
現在の時刻を取得→JSONで動的アクションを使用したことが理由かも
参考🔻
https://blog.jbs.co.jp/entry/2024/06/24/145509

明日、JSONから動的アクションを消してみる

ー追記ー
動的アクション消したら実装できた。
けど、アダプティブは一回しか反応できないので、複数人いるチャネルでは誰かが反応したら、その後の反応が無効になる。
今回は勤怠入力のアダプティブカードを作りたかったが断念。

PowerAppsで作れるが、そこまでするべきなのか謎。多分作らない、、、、、

終わり

社内アプリ作成記📝

《アプリの内容》
社員の資格情報などを、検索・登録する
受験者の見積もり
受験者へパスワード送付(管理者のみ)
受験結果の収集
パスワード再送付(本人アドレス)

実装の実績と予定を随時更新
PowerAppsで作成中

実装済
・部署選択のプルダウン作成済み
・名前検索結果はOffice365に紐付けして表示
・3画面作成、homeへ戻るボタン設置
・検索ボタン設置

💭実装予定
・検索画面をポップアップ画面にしたい
・入社年を登録時に必須項目にする(勤続年数は元Excelで計算)
・検索(登録)項目に以下を追加
合格不合格、最終受験日、勤続年数

PAフロー備忘録:Team_最新の親スレッドIDを取得

Teamsチャットで最新の親スレッドへ返信をするフローをつくった際の備忘録

■アクション名:メッセージを取得
チーム:(プルダウンから選択)
チャネル:(プルダウンから選択)

出力結果は以下。マーカー部分を取得したい。
(最新スレッドが1番上)


  1.   "@odata.context": "https://〜",
  2.   "@odata.count": 19,(スレッド数 ※最大20まで取得可能)
  3.   "@odata.nextLink": "https://〜",
  4.   "value": [
  5.     {
  6. "id": "XXXXXXXXX(メッセージID)",
  7.       "etag": "数字",
  8.       "messageType": "message",
  9.       "createdDateTime": "yyyy-mm-ddT01:21:10.99Z",
  10.       "lastModifiedDateTime": "yyyy-mm-ddT01:21:10.99Z",
  11.       "subject": "●●●●●●●(スレッドのタイトル)",
  12.       "importance": "normal",
  13.       "locale": "en-us",
  14.       "webUrl": "https://〜",
  15.       "from": {
  16.         "user": {
  17.           "@odata.type": "#microsoft.graph.teamworkUserIdentity",
  18.           "id": "XXXXX-XXX-XXX-XXX-XXXXXXXXXXXX",
  19.           "displayName": "●●●●●●●(投稿ユーザ)",
  20.           "userIdentityType": "aadUser",
  21.           "tenantId": "XXXXXX-XXX-XXX-XXX-XXXXXXXXX"
  22.         }
  23.       },
  24.       "body": {
  25.         "contentType": "html",
  26.         "content": "<p><at id=\"0\">●●●●(メンションタグ名)</at></p>\n<p>&nbsp;</p>\n<p>//////</p>\n<p>●●●●●(本文)</p>,
  27.       "channelIdentity": {
  28.         "teamId": "XXXXXX-XXX-XXX-XXX-XXXXXXXXX",
  29.         "channelId": "XXXXXX-XXX-XXX-XXX-XXXXXXXXX"
  30.       },
  31.       "attachments": [
  32.         {
  33.           "id": "XXXXXX-XXX-XXX-XXX-XXXXXXXXX",
  34.           "contentType": "reference",
  35.           "contentUrl": "https://〜(添付ファイルURL)",
  36.           "name": "●●●●●.xlsm(添付ファイル名)"
  37.         }
  38.       ],
  39.       "mentions": [
  40.         {
  41.           "id": 0,
  42.           "mentionText": "●●●●(メンション名)",
  43.           "mentioned": {
  44.             "application": null,
  45.             "device": null,
  46.             "user": null,
  47.             "conversation": null,
  48.             "tag": {
  49.               "id": "XXXXXX-XXX-XXX-XXX-XXXXXXXXX==",
  50.               "displayName": "●●●●(メンション名)"
  51.             }
  52.           }
  53.         }
  54.       ],
  55.       "reactions": []
  56.     },
  57.     ・
  58.     ・
  59.     ・
  60.   


■アクション名:変数を初期化する
Name:メッセージID
Type:Arry

■アクション名:配列変数に追加
Name:メッセージID
Value:item()?['id']

※Select an output from previous steps
outputs('メッセージを取得します')?['body/value']

■アクション名:作成
replace(variables('メッセージID')[0],'"','')

以下は式の説明。


最新のスレッドは要素数0(最初)になるので
variables('メッセージID')[0]
と記載。


メッセージIDは「"111111"」と出力されるので
replace関数で「"」を「(なし)」に置き換えている

PAでAPIを叩いてレポートを取得する

PowerAutomateで MyJVN API を叩いてレポートを取得

概要 :本日公開されたレポートがある場合、毎朝h時Teamsに内容を投稿する
実行時間:完了まで3秒

✅2024/11/11修正
■アクション名:タイムゾーンの変換
【変更前】Time unit:yyyy年M月dd日
【変更後】Time unit:yyyy年M月d日


≪フロー概要≫
■毎朝h時に実行するトリガーを設定

■アクション名:HTTPを要求
APIを叩くと最大50件(retMax)までしか出力できないので、出力数を最新20件に絞る工程が必要となる
最新20件のエントリ開始位置を取得するには総数-19をすれば良い。
レポートを全件取得して総件数を調査 …応答値の「totalRes=総数」で得ることができる

URI https://jvndb.jvn.jp/myjvn?method=getAlertList&feed=hnd&method=getAlertList&ft=json
Method GET


■アクション名:JSONの解析
Content:body('HTTPを要求_総数を取得')

Schema:

  1. {
  2.     "type": "object",
  3.     "properties": {
  4.         "feed": {
  5.             "type": "object",
  6.             "properties": {
  7.                 "title": {
  8.                     "type": "string"
  9.                 },
  10.                 "id": {
  11.                     "type": "string"
  12.                 },
  13.                 "author": {
  14.                     "type": "object",
  15.                     "properties": {
  16.                         "name": {
  17.                             "type": "string"
  18.                         },
  19.                         "uri": {
  20.                             "type": "string"
  21.                         }
  22.                     }
  23.                 },
  24.                 "updated": {
  25.                     "type": "string"
  26.                 },
  27.                 "link": {
  28.                     "type": "string"
  29.                 },
  30.                 "sec:handling": {
  31.                     "type": "object",
  32.                     "properties": {
  33.                         "marking:Marking": {
  34.                             "type": "object",
  35.                             "properties": {
  36.                                 "marking:Marking_Structure": {
  37.                                     "type": "object",
  38.                                     "properties": {
  39.                                         "xsi:type": {
  40.                                             "type": "string"
  41.                                         },
  42.                                         "marking_model_name": {
  43.                                             "type": "string"
  44.                                         },
  45.                                         "marking_model_ref": {
  46.                                             "type": "string"
  47.                                         },
  48.                                         "color": {
  49.                                             "type": "string"
  50.                                         }
  51.                                     }
  52.                                 }
  53.                             }
  54.                         }
  55.                     }
  56.                 },
  57.                 "entry": {
  58.                     "type": "array",
  59.                     "items": {
  60.                         "type": "object",
  61.                         "properties": {
  62.                             "title": {
  63.                                 "type": "string"
  64.                             },
  65.                             "id": {
  66.                                 "type": "string"
  67.                             },
  68.                             "link": {
  69.                                 "type": "string"
  70.                             },
  71.                             "summary": {
  72.                                 "type": "string"
  73.                             },
  74.                             "category": {
  75.                                 "type": "object",
  76.                                 "properties": {
  77.                                     "term": {
  78.                                         "type": "string"
  79.                                     },
  80.                                     "label": {
  81.                                         "type": "string"
  82.                                     }
  83.                                 }
  84.                             },
  85.                             "update": {
  86.                                 "type": "string"
  87.                             },
  88.                             "published": {
  89.                                 "type": "string"
  90.                             },
  91.                             "sec:items": {
  92.                                 "type": "array",
  93.                                 "items": {
  94.                                     "type": "object",
  95.                                     "properties": {
  96.                                         "sec:item": {
  97.                                             "type": "object",
  98.                                             "properties": {
  99.                                                 "sec:title": {
  100.                                                     "type": "string"
  101.                                                 },
  102.                                                 "sec:identifier": {
  103.                                                     "type": "string"
  104.                                                 },
  105.                                                 "sec:link": {
  106.                                                     "type": "string"
  107.                                                 },
  108.                                                 "sec:published": {
  109.                                                     "type": "string"
  110.                                                 },
  111.                                                 "sec:updated": {
  112.                                                     "type": "string"
  113.                                                 },
  114.                                                 "sec:author": {
  115.                                                     "type": "object",
  116.                                                     "properties": {
  117.                                                         "value": {
  118.                                                             "type": "string"
  119.                                                         }
  120.                                                     }
  121.                                                 }
  122.                                             }
  123.                                         }
  124.                                     },
  125.                                     "required": [
  126.                                         "sec:item"
  127.                                     ]
  128.                                 }
  129.                             }
  130.                         },
  131.                         "required": [
  132.                             "title",
  133.                             "id",
  134.                             "link",
  135.                             "summary",
  136.                             "category",
  137.                             "update",
  138.                             "published",
  139.                             "sec:items"
  140.                         ]
  141.                     }
  142.                 },
  143.                 "status:Status": {
  144.                     "type": "object",
  145.                     "properties": {
  146.                         "version": {
  147.                             "type": "string"
  148.                         },
  149.                         "method": {
  150.                             "type": "string"
  151.                         },
  152.                         "retCd": {
  153.                             "type": "integer"
  154.                         },
  155.                         "retMax": {
  156.                             "type": "string"
  157.                         },
  158.                         "errCd": {
  159.                             "type": "string"
  160.                         },
  161.                         "errMsg": {
  162.                             "type": "string"
  163.                         },
  164.                         "totalRes": {
  165.                             "type": "string"
  166.                         },
  167.                         "totalResRet": {
  168.                             "type": "string"
  169.                         },
  170.                         "firstRes": {
  171.                             "type": "string"
  172.                         },
  173.                         "ft": {
  174.                             "type": "string"
  175.                         },
  176.                         "feed": {
  177.                             "type": "string"
  178.                         }
  179.                     }
  180.                 }
  181.             }
  182.         }
  183.     }
  184. }
■アクション名:作成
int整数の関数で文字列バージョンを実際の整数値に変換する必要がある

入力:int(body('JSON_の解析')?['feed']?['status:Status']?['totalRes'])

■アクション名:変数を初期化
Name:総数
Type:Integer
Value:outputs('作成')

■アクション名:総数を減らす
レポート総件数から-19した数値を取得して、エントリ開始位置に設定する。例)総数87-19=68を
Name:総数
Value:19

■アクション名:HTTPを要求
エントリ開始位置(startItem)~最大件数を出力して最新20件を取得 
※maxCountItem(最大件数)を設定するとエラーになるので未設定でOK

URI https://jvndb.jvn.jp/myjvn?method=getAlertList&feed=hnd&method=getAlertList&ft=json&startItem=<総数>
Method GET

■アクション名:JSONの解析
Content:body('HTTPを要求_最新20件を取得')
Schemaは最初のJSONの解析と同じ

■アクション名:タイムゾーンの変換
本日の日付をyyyy年mm月dd日の型に変更する
Base time: utcNow()
Source time zone:(UTC) Coordinated Universal Time
Destination time zone:(UTC+09:00) Osaka, Sapporo, Tokyo
Time unit:yyyy年M月d日

■アクション名:時間からの減算
Base time:body('今日の日付をyyyy年mm月dd日に変換')
Interval:1
Time unit:Day

■アクション名:タイムゾーンの変換
減算したあとの日付(昨日の日付)をyyyy年m月d日に変換する
Base time:body('時間からの減算')
Source time zone:(UTC) Coordinated Universal Time
Destination time zone:(UTC+09:00) Osaka, Sapporo, Tokyo
Time unit:yyyy年M月d日

■アクション名:作成
以下2種類作成
・入力:body('今日の日付をyyyy年m月d日に変換')
・入力:body('昨日の日付をyyyy年m月d日に変換')

■アクション名:JSONフィルター処理
以下2種類作成して、昨日と今日の日付でそれぞれフィルタする


From:body('JSON_の解析-2')?['feed']?['entry']
Filter Query:item()?['title']
以下を右枠へ順に記載or選択
contains
outputs('今日の日付')or


From:body('JSON_の解析-2')?['feed']?['entry']
Filter Query:item()?['title']
以下を右枠へ順に記載or選択
contains
outputs('昨日の日付')


■アクション名:変数の初期化
空の変数を用意する
Name:3項目
Type:Arry

■アクション名:配列変数に追加
変数3項目にフィルター結果を追加する
以下2種類作成して、昨日と今日の日付のフィルタ結果を追加する
HTMLタグも一緒に追加する


Select an output from previous steps:outputs('タイトルでフィルター処理1')['body']
Name:3項目
Value :

items('For_each')['title']

レベル:items('For_each')?['category']?['label'](リンク


Select an output from previous steps:outputs('タイトルでフィルター処理2')['body']
Name:3項目
Value :

items('For_each_2')['title']

レベル:items('For_each_2')?['category']?['label'](リンク


■アクション名:作成
本日のレポート結果があるかIf関数で判定
この判定結果は後の条件分岐の際に使用する
入力:if(Empty(variables('3項目')),'空白でした','空白ではありません')

■アクション名:作成
配列を文字列にする
入力:string(variables('3項目'))

■アクション名:作成
配列に含まれる記号「[ ]」、「,」を置換して消す
replace(replace(replace(replace(outputs('配列変数3項目を文字列に変換'),'[',''),'"',''),',',''),']','')


■アクション名:条件分岐アクション
左から以下を入力or選択
outputs('本日のレポート結果を確認')
is equal to
空白ではありません

True :Teamsへ投稿
False:フロー終了(「Status」は「Succeeded」に設定 = Falesの場合"フロー成功"とする。)

≪フロー完了≫

                                                                                                                                                                                                            • -

参考にしたページ
・JSON2階層目以降のアクセス方法:Power Automate で JSON 内の値を取得する方法 | 株式会社イルミネート・ジャパン (illuminate-j.jp)
https://www.illuminate-j.jp/blog/automate-jsonhint

・配列作成:【Power Automate】JSONから配列を作り、配列内の数値を合計する #PowerAutomate - Qiita
https://qiita.com/DaddyDaddy/items/a2d2c9b03d3ad3ca5b3e

PA関数:
・【PowerAutomate】空白・Nullを判定する方法【4選】。変数・配列を空にする方法も! | ネットワークエンジニアになった人 (mizusibuki.com)
https://mizusibuki.com/pa-how-to-determine-null/#toc8

・【PowerAutomate】複数の文字を同時に置換する。replaceをループで処理して式を見やすくする方法も。 | ネットワークエンジニアになった人 (mizusibuki.com)
https://mizusibuki.com/pa-multiple-replace/#:~:text=%E5%BC%8F%E3%81%AE%E4%B8%AD%E3%81%AB%E8%87%AA%E5%88%86

・HTMLタグ/HTML要素一覧 - TAG index
https://www.tagindex.com/html_tag/elements/#:~:text=%3Cdiv%3E

map関数について

📝少し理解が浅いのでまとめていく

理解が深まった動画🎥
- YouTube

・map関数は配列のみに使用できる
・オブジェクトには使用できない
・foreachとも違う(動画)
 

  1. dataTable.addRows(-1, Space.map(i =>
  2.   [
  3.       i.id,
  4.       i.projectKey,
  5.       i.name,
  6.   ]));
dataTable.addRows: dataTableに新しい行を追加するメソッド。

  • 1: この引数は、新しい行をテーブルの最後に追加することを示す。

Space.map(i => [...]): Spaceという配列に対してmapメソッドを使用し、各要素iを新しい配列に変換している。
i.id, i.projectKey, i.name: 各要素のid、projectKey、nameを取得し、それらを新しい配列として格納しています。
結果として、Space内の各要素に基づいて、id、projectKey、nameの3つのカラムを持つ行がdataTableに追加。

  1.   dataTable_2.addRows(-1, [
  2.     [
  3.       Space.issue / 1048576 ,
  4.       Space.wiki / 1048576,
  5.       Space.file / 1048576,
  6.       Space.subversion / 1048576,
  7.       Space.git / 1048576,
  8.       Space.gitLFS / 1048576,
  9.       Space.pullRequest / 1048576,
  10.     ]
dataTable_2.addRows: dataTable_2に新しい行を追加するメソッド。

  • 1: 新しい行をテーブルの最後に追加することを示す。

配列: 新しい行として追加するデータは、特定の項目を1048576で割った値の配列。
各値(Space.issue, Space.wikiなど)は、ストレージやリソースの量。
1048576で割ることで、値がメガバイト単位に変換。
この結果、dataTable_2には、メガバイト単位に変換されたリソースの使用量が1行追加。

【Outlook VBA】連絡先をExcelに抽出

初回に、Outlookで以下の設定を実施しないとマクロが起動しません
①開発タブを表示させる
②ツール > 参照設定 > 一覧から「Microsoft Excel XX.X Object Library」を探してチェック

【下準備】
Cドライブ上のフォルダに転記用のExcelファイルを格納しておく

◼️その他OutlookVBAについて
https://extan.jp/?p=421#%E3%82%82%E3%81%97%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%89

◼️参考ページ
https://www.teijitaisya.com/outlookvba-getuserinfofromex/


  1. Sub GetUserInfoFromExchange()
  2.     Dim myNameSpace As NameSpace
  3.     Dim myAddressList As AddressList
  4.     Dim myAddressEntries As AddressEntries
  5.     
  6.     Set myNameSpace = Application.GetNamespace("MAPI")
  7.     Set myAddressList = myNameSpace.AddressLists("Offline Global Address List")
  8.     Set myAddressEntries = myAddressList.AddressEntries
  9.     
  10.     Dim xExcelFile As String
  11.     Dim xExcelApp As Excel.Application
  12.     Dim xWb As Excel.Workbook
  13.     Dim xWs As Excel.Worksheet
  14.     Dim xExcelRange As Excel.Range
  15.     xExcelFile = "C:\格納フォルダ名\転記用ファイル.xlsx" '【下準備】で用意した、転記先のファイルパスを記載
  16.     
  17.     Set xExcelApp = CreateObject("Excel.Application")
  18.     Set xWb = xExcelApp.Workbooks.Open(xExcelFile)
  19.     Set xWs = xWb.Sheets(1)
  20.     
  21.     xWs.Activate
  22.     Set xExcelRange = xWs.Range("A1")
  23.     xExcelRange.Activate
  24.     xExcelApp.Visible = True
  25.     
  26.     xExcelRange.Range("A1").CurrentRegion.ClearContents 'シートを初期化(前回の転記結果を消去する処理)
  27.     
  28.              With xWs '項目記載
  29.         
  30.             .Cells(1, 1).Value = "社名"
  31.             .Cells(1, 2).Value = "部署"
  32.             .Cells(1, 3).Value = "役職"
  33.             .Cells(1, 4).Value = "氏名"
  34.             .Cells(1, 5).Value = "TEL"
  35.             .Cells(1, 6).Value = "Mobile"
  36.             .Cells(1, 7).Value = "郵便番号"
  37.             .Cells(1, 8).Value = "オフィスロケーション"
  38.             .Cells(1, 9).Value = "エイリアス"
  39.             .Cells(1, 10).Value = "住所"
  40.             .Cells(1, 11).Value = "メールアドレス"
  41.                      
  42.         End With
  43.    
  44.     Dim l As AddressEntry
  45.     Dim oExUser As ExchangeUser
  46.     
  47.         Dim i As Long
  48.         i = 2
  49.     
  50.     For Each l In myAddressEntries
  51.         Set oExUser = l.GetExchangeUser
  52.         If Not oExUser Is Nothing Then</span>
  53.                            
  54.       With xWs '転記
  55.                  .Cells(i, 1).Value = oExUser.CompanyName
  56.                  .Cells(i, 2).Value = oExUser.Department
  57.                  .Cells(i, 3).Value = oExUser.JobTitle
  58.                  .Cells(i, 4).Value = oExUser.Name
  59.                  .Cells(i, 5).Value = oExUser.BusinessTelephoneNumber
  60.                  .Cells(i, 6).Value = oExUser.MobileTelephoneNumber
  61.                  .Cells(i, 7).Value = oExUser.PostalCode
  62.                  .Cells(i, 8).Value = oExUser.OfficeLocation
  63.                  .Cells(i, 9).Value = oExUser.Alias
  64.                  .Cells(i, 10).Value = oExUser.StreetAddress
  65.                  .Cells(i, 11).Value = oExUser.PrimarySmtpAddress
  66.                          
  67.             End With
  68.             
  69.         i = i + 1
  70.         
  71.         End If
  72.     Next
  73.     
  74.     With xWs '所属部署でソート
  75.     .Sort.SortFields.Clear
  76.     
  77.     .Sort.SortFields.Add _
  78.         Key:=ActiveSheet.Cells(1, 2), _'B2セルをキーとしてソートする(他をキーとする場合は変更する)
  79.         SortOn:=xlSortOnValues, _
  80.         Order:=xlAscending, _
  81.         DataOption:=xlSortNormal
  82.         
  83.         With .Sort
  84.             .SetRange Range("A1").CurrentRegion
  85.             .Header = xlYes
  86.             .MatchCase = False
  87.             .Orientation = xlTopToBottom
  88.             .SortMethod = xlPinYin
  89.             .Apply
  90.             
  91.         End With
  92.     
  93.     End With
  94.     
  95.     MsgBox "転記が完了しました"
  96.             
  97. End Sub

【officescript】Backlog 続編②

◼️プロジェクト情報の抽出

📝メモ
レスポンスが数値のみだったので何故?文字コード表記?と思ってたけど
結局B(バイト)表記になっていただけだった。
バイト→メガバイトにしたいので計算して転記する。
(1048576B=1MB)
四捨五入はExcelシート上の書式で設定。


  1. async function main(workbook: ExcelScript.Workbook): Promise<void> {
  2.   const sheet = workbook.getWorksheet("Project"); //"Project"シートを指定
  3.   const backlogUrl = sheet.getRange("B1").getValue(); //B1セルにURLを記載
  4.   const apiKey = sheet.getRange("B2").getValue(); //B2セルにAPIキーを記載
  5.     // テーブルの取得と初期化
  6.   const dataTable = sheet.getTable("プロジェクト一覧");
  7.   const dataTable_2 = sheet.getTable("プロジェクト容量");
  8.     var rowCount = dataTable_2.getRowCount();
  9.     if (rowCount > 0) {
  10.       dataTable_2.deleteRowsAt(0, dataTable_2.getRowCount());
  11.     }
  12.     //"Project"テーブルのプロジェクトキー(B列)をループで繰り返し取得する
  13.     //プロジェクトキー列の値を取得して変数(columnB)へ代入
  14.   let columnB = dataTable.getColumnByName("プロジェクトキー").getRangeBetweenHeaderAndTotal().getValues();
  15.   // B列の値を1つずつ処理
  16. for (let i = 0; i < columnB.length; i++) {
  17.     let ProjectKey = columnB[i][0];
  18.     // プロジェクト別容量使用状況の取得と表示
  19.     /*API出力結果の確認用のコード===========================================
  20.     const response = await fetch(`${backlogUrl}/api/v2/projects/${ProjectKey}/diskUsage?apiKey=${apiKey}`);
  21.     const data: string = await response.json();
  22.     console.log(data);
  23.     =============================================================*/
  24.   //レスポンスの単位をB→MBに変換する(/1048576)
  25.       const Space: Space[] = await (await fetch(`${backlogUrl}/api/v2/projects/${ProjectKey}/diskUsage?apiKey=${apiKey}`)).json();
  26.   
  27. //map関数は使わない
  28.   dataTable_2.addRows(-1, [
  29.     [
  30.       Space.issue / 1048576 ,
  31.       Space.wiki / 1048576,
  32.       Space.file / 1048576,
  33.       Space.subversion / 1048576,
  34.       Space.git / 1048576,
  35.       Space.gitLFS / 1048576,
  36.       Space.pullRequest / 1048576,
  37.     ]
  38.   ]);
  39. }
  40. }
  41.     interface Space {
  42.       projectId: boolean,
  43.       issue: boolean,
  44.       wiki: boolean,
  45.       file: string,
  46.       subversion: string,
  47.       git: string,
  48.       gitLFS: string,
  49.       pullRequest: string,
  50.     }