feat: 取得方式(D7)を読み込むfetchMethod変数を追加
This commit is contained in:
parent
ee1448504c
commit
4dc4b0cc1d
291
XVBA/新版着工要因閲覧シート/vba-files/Module/Module1.bas
Normal file
291
XVBA/新版着工要因閲覧シート/vba-files/Module/Module1.bas
Normal file
@ -0,0 +1,291 @@
|
||||
Attribute VB_Name = "Module1"
|
||||
Option Explicit
|
||||
|
||||
Public apiKey As String
|
||||
Public baseURL As String
|
||||
Public yearFilter As String
|
||||
Public tableId As String
|
||||
Public defaultSh As Worksheet
|
||||
Public fetchMethod As String
|
||||
|
||||
Function init()
|
||||
'Pleasanter API KEY
|
||||
apiKey = "6504c8a807677a3a576e10327f3c19876c55736ee45d4a845796b9e7f5e087bfd4bd0d8184863da8cf1733ca635111432ab334aea59102b06a96ee6d2c05190d"
|
||||
baseURL = "https://nextoffice.Next-hd.co.jp"
|
||||
tableId = Range("着工要因ID")
|
||||
|
||||
Set defaultSh = ThisWorkbook.Sheets("基本情報")
|
||||
fetchMethod = defaultSh.Range("D7").Value
|
||||
End Function
|
||||
|
||||
'******************************************************************************
|
||||
Sub run()
|
||||
'初期化処理
|
||||
Call init
|
||||
|
||||
defaultSh.Range("D3").Value = "取込処理中..."
|
||||
Application.ScreenUpdating = False '画面更新停止
|
||||
Application.Calculation = xlManual '自動計算停止
|
||||
'------------------------------------------
|
||||
Debug.Print "処理開始"
|
||||
|
||||
'CSVデータ取得処理
|
||||
Dim resData As Variant
|
||||
|
||||
Debug.Print "データ取得処理開始"
|
||||
'テーブルのCSVデータ取得
|
||||
resData = exportCSVData(tableId)
|
||||
|
||||
'resDataが空の場合はスキップ
|
||||
If IsEmpty(resData) Or resData = "" Then
|
||||
Debug.Print "データが取得できませんでした"
|
||||
Else
|
||||
'CSVデータをシートに出力
|
||||
Call exportCSVDataToSheet(resData, tableId)
|
||||
End If
|
||||
|
||||
|
||||
Debug.Print "処理終了"
|
||||
'------------------------------------------
|
||||
Application.Calculation = xlAutomatic '自動計算再開
|
||||
Application.ScreenUpdating = True '画面更新再開
|
||||
defaultSh.Range("D3").Value = "取込処理完了"
|
||||
End Sub
|
||||
|
||||
'******************************************************************************
|
||||
'CSVデータを取得
|
||||
Function exportCSVData(tableId As String) As Variant
|
||||
'共通変数
|
||||
Dim apiUrl As String
|
||||
Dim apiUrlParam As String
|
||||
|
||||
'リクエストURL
|
||||
apiUrl = baseURL & "/pleasanter/api/items/" & tableId & "/"
|
||||
apiUrlParam = "export"
|
||||
|
||||
'ヘッダ
|
||||
Dim apiHeaders As New Dictionary
|
||||
apiHeaders.Add "Content-Type", "application/json;charset=utf-8"
|
||||
|
||||
'リクエストデータ
|
||||
Dim apiBody As New Dictionary
|
||||
apiBody.Add "ApiVersion", "1.1"
|
||||
apiBody.Add "ApiKey", apiKey
|
||||
apiBody.Add "ExportId", "1"
|
||||
|
||||
'Filter変数
|
||||
'Dim colFilter As New Dictionary
|
||||
'colFilter.Add "ClassZ", "[" & yearFilter & "]"
|
||||
|
||||
'View変数
|
||||
'Dim view As New Dictionary
|
||||
'view.Add "ColumnFilterHash", colFilter
|
||||
'apiBody.Add "View", view
|
||||
|
||||
'HTTPリクエスト送信メソッド呼び出し
|
||||
Dim res As Object
|
||||
Set res = callRestApi("POST", apiUrl, apiUrlParam, apiHeaders, apiBody)
|
||||
|
||||
If res("StatusCode") = 200 Then
|
||||
Debug.Print "CSVデータの取得に成功しました"
|
||||
exportCSVData = res("Response")("Content")
|
||||
|
||||
End If
|
||||
|
||||
End Function
|
||||
|
||||
'******************************************************************************
|
||||
'CSVデータをシートに書き込む
|
||||
Function exportCSVDataToSheet(csvData As Variant, targetSheet As String)
|
||||
Debug.Print "CSVデータをシートに出力開始: " & targetSheet
|
||||
'------------------------------------------
|
||||
'CSVデータを「テーブル」部分に出力する処理
|
||||
Dim ws As Worksheet
|
||||
On Error Resume Next
|
||||
Set ws = ThisWorkbook.Sheets(targetSheet)
|
||||
On Error Goto 0
|
||||
|
||||
If ws Is Nothing Then
|
||||
Debug.Print "シートが存在しないため新規作成: " & targetSheet
|
||||
Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.count))
|
||||
ws.Name = targetSheet
|
||||
End If
|
||||
|
||||
'CSVデータをテーブルに挿入(ダブルクォート内の改行・カンマに対応したCSVパース)
|
||||
Dim i As Long, j As Long
|
||||
Dim arr() As Variant
|
||||
Dim maxCols As Long
|
||||
|
||||
Dim rows As Collection
|
||||
Set rows = ParseCsv(csvData)
|
||||
|
||||
If rows.count <= 1 Then
|
||||
MsgBox "データが存在しません(ヘッダのみ): " & targetSheet, vbExclamation
|
||||
Exit Function
|
||||
End If
|
||||
|
||||
maxCols = 0
|
||||
Dim rowArr As Variant
|
||||
For Each rowArr In rows
|
||||
If UBound(rowArr) + 1 > maxCols Then
|
||||
maxCols = UBound(rowArr) + 1
|
||||
End If
|
||||
Next rowArr
|
||||
|
||||
' 二次元配列を初期化
|
||||
ReDim arr(0 To rows.count - 1, 0 To maxCols - 1)
|
||||
|
||||
' 配列に格納
|
||||
i = 0
|
||||
For Each rowArr In rows
|
||||
For j = LBound(rowArr) To UBound(rowArr)
|
||||
arr(i, j) = rowArr(j)
|
||||
Next j
|
||||
i = i + 1
|
||||
Next rowArr
|
||||
|
||||
'テーブル(ListObject)取得
|
||||
Dim tbl As ListObject
|
||||
On Error Resume Next
|
||||
Set tbl = ws.ListObjects(targetSheet)
|
||||
On Error Goto 0
|
||||
|
||||
If tbl Is Nothing Then
|
||||
Debug.Print "テーブルが存在しないため新規作成: " & targetSheet
|
||||
Dim headerRange As Range
|
||||
Set headerRange = ws.Range("A1").Resize(1, maxCols)
|
||||
For j = 0 To maxCols - 1
|
||||
headerRange.Cells(1, j + 1).Value = arr(0, j)
|
||||
Next j
|
||||
Set tbl = ws.ListObjects.Add(xlSrcRange, headerRange, , xlYes)
|
||||
tbl.Name = targetSheet
|
||||
End If
|
||||
|
||||
'テーブルのデータ部分をクリア
|
||||
If Not tbl.DataBodyRange Is Nothing Then
|
||||
tbl.DataBodyRange.ClearContents
|
||||
End If
|
||||
|
||||
' テーブルにデータを追加(ヘッダ行(arr(0,*))を除いたデータ部分のみをDataBodyRangeに書き込む)
|
||||
tbl.Resize tbl.Range.Resize(rows.count, maxCols)
|
||||
|
||||
Dim dataArr() As Variant
|
||||
ReDim dataArr(1 To rows.count - 1, 1 To maxCols)
|
||||
For i = 1 To rows.count - 1
|
||||
For j = 1 To maxCols
|
||||
dataArr(i, j) = arr(i, j - 1)
|
||||
Next j
|
||||
Next i
|
||||
tbl.DataBodyRange.Value = dataArr
|
||||
|
||||
'------------------------------------------
|
||||
Debug.Print "CSVデータをシートに出力完了: " & targetSheet
|
||||
|
||||
End Function
|
||||
|
||||
'******************************************************************************
|
||||
'CSV文字列をパースし、行ごとのフィールド配列を格納したCollectionを返す
|
||||
'ダブルクォートで囲まれたフィールド内の改行・カンマ・エスケープされた""に対応(RFC4180準拠)
|
||||
Private Function ParseCsv(Byval csvText As String) As Collection
|
||||
Dim rows As New Collection
|
||||
Dim fields As Collection
|
||||
Set fields = New Collection
|
||||
|
||||
Dim field As String
|
||||
Dim inQuotes As Boolean
|
||||
Dim i As Long, ch As String, nextCh As String
|
||||
Dim textLen As Long
|
||||
textLen = Len(csvText)
|
||||
inQuotes = False
|
||||
field = ""
|
||||
|
||||
i = 1
|
||||
Do While i <= textLen
|
||||
ch = Mid(csvText, i, 1)
|
||||
|
||||
If inQuotes Then
|
||||
If ch = """" Then
|
||||
nextCh = Mid(csvText, i + 1, 1)
|
||||
If nextCh = """" Then
|
||||
field = field & """"
|
||||
i = i + 1
|
||||
Else
|
||||
inQuotes = False
|
||||
End If
|
||||
Else
|
||||
field = field & ch
|
||||
End If
|
||||
Else
|
||||
Select Case ch
|
||||
Case """"
|
||||
inQuotes = True
|
||||
Case ","
|
||||
fields.Add field
|
||||
field = ""
|
||||
Case vbCr, vbLf
|
||||
If ch = vbCr And Mid(csvText, i + 1, 1) = vbLf Then i = i + 1
|
||||
fields.Add field
|
||||
field = ""
|
||||
If Not (fields.count = 1 And fields(1) = "") Then
|
||||
rows.Add CollectionToArray(fields)
|
||||
End If
|
||||
Set fields = New Collection
|
||||
Case Else
|
||||
field = field & ch
|
||||
End Select
|
||||
End If
|
||||
i = i + 1
|
||||
Loop
|
||||
|
||||
'最終フィールド・行(末尾に改行が無い場合)
|
||||
If field <> "" Or fields.count > 0 Then
|
||||
fields.Add field
|
||||
rows.Add CollectionToArray(fields)
|
||||
End If
|
||||
|
||||
Set ParseCsv = rows
|
||||
End Function
|
||||
|
||||
'Collection(1次元)を0始まりのVariant配列に変換
|
||||
Private Function CollectionToArray(Byval col As Collection) As Variant
|
||||
Dim arr() As Variant
|
||||
ReDim arr(0 To col.count - 1)
|
||||
Dim k As Long
|
||||
For k = 1 To col.count
|
||||
arr(k - 1) = col(k)
|
||||
Next k
|
||||
CollectionToArray = arr
|
||||
End Function
|
||||
|
||||
'******************************************************************************
|
||||
'REST API呼出処理
|
||||
' method GetかPOSTか
|
||||
' url REST APIのURL
|
||||
' urlParam リクエストパラメータ(オプション)
|
||||
' headers ヘッダ(オプション)
|
||||
Function callRestApi(Byval method As String, Byval url As String, Optional Byval urlParam As String = "", Optional Byval headers As Dictionary = Null, Optional Byval body As Dictionary = Null) As Object
|
||||
|
||||
'HTTPリクエストのオブジェクトを定義
|
||||
Dim objHTTP As Object
|
||||
Set objHTTP = New XMLHTTP60
|
||||
|
||||
'HTTPリクエストの接続先を設定
|
||||
objHTTP.Open method, url & urlParam, False
|
||||
|
||||
'リクエストヘッダーを設定(複数ある場合はsetRequestHeaderを複数書けば良いのだ~)
|
||||
Dim i As Long
|
||||
For i = 0 To headers.count - 1
|
||||
objHTTP.setRequestHeader headers.keys(i), headers.items(i)
|
||||
Next i
|
||||
|
||||
'リクエスト送信
|
||||
objHTTP.send JsonConverter.ConvertToJson(body)
|
||||
|
||||
Do While objHTTP.readyState < 4
|
||||
DoEvents
|
||||
Loop
|
||||
|
||||
'レスポンスの文字列(objHTTP.responseText)をJsonに変換して返却
|
||||
Set callRestApi = JsonConverter.ParseJson(objHTTP.responseText)
|
||||
|
||||
End Function
|
||||
Loading…
Reference in New Issue
Block a user