0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PowerShell 業務自動化レシピ #4】複数CSVを1枚に結合して集計(店舗別・月別の売上をピボット集計)

0
Posted at

株式会社Good Labでエンジニアをしている コータロー です。
日々、Java・SQL・Gitなどの技術情報や、新人エンジニア向けの学習ノウハウ、
AI活用についての情報を発信しています。

Good Labについて気になった方は、コーポレートサイトもぜひご覧ください。
コーポレートサイト


本記事は 「PowerShell 業務自動化レシピ」 シリーズの第4回です。このシリーズは、文法解説ではなく 「1記事=1つの業務課題」を、コピペで動く検証済みスクリプトで解決することを目的とした実務レシピ集です(全12回想定)。SES・受託・社内運用の現場で、いまだに手作業でやっている地味な作業を片っ端から自動化していきます。

第1回 では「大量ファイルの一括リネーム」、第2回 では「古いログファイルの抽出・自動削除」、第3回 では「フォルダ構成・ファイル一覧をExcel台帳化」を扱いました。第3回で「集めたファイルを Group-ObjectMeasure-Object で集計する」流れに触れましたが、今回はその延長で、中身(CSVデータ)そのものを集めて集計します。

第4回のテーマは 「複数CSVを1枚に結合して集計」。各拠点・各月から上がってくるバラバラのCSV(売上・勤怠・在庫…)を Import-Csv で読み込み、Group-ObjectMeasure-Object で横断集計し、1枚のサマリCSVにまとめます。「フォルダ内の全CSVを縦に結合」「結合データを項目別に集計」が中心です。

本記事は PowerShell 7(pwsh、クロスプラットフォーム) を基準にしています。Windows標準の Windows PowerShell 5.1 での差異は、各所と最後の章で明記します。

今回は 読み取り+CSV出力のみ で、元のCSVを書き換えたり消したりはしません(破壊的操作なし)。安心して試せますが、出力先CSVの上書きにだけ軽く注意します(後述)。


Before:手作業のつらいシーン

シーン1:拠点×月のCSVをExcelにコピペ結合

「全店舗・全月の売上を1枚にまとめて、カテゴリ別の合計を出して」。各店舗から sales_202604_tokyo.csv sales_202605_osaka.csv … が毎月メールで届く。1ファイルずつExcelで開いて、中身を選択して、結合用シートに下へ下へとコピペ。

  • ファイルが12拠点×12ヶ月で 144枚。1枚あたり「開く→コピー→貼り付け」で十数秒〜数十秒
  • 全部貼り終えたら、今度はピボットテーブルでカテゴリ別・拠点別に集計
  • 体感 半日仕事。しかも貼り間違い・貼り漏れ・行ずれのリスクつき

シーン2:「どのファイルのデータか」が結合すると分からなくなる

縦に結合した瞬間、どの行がどの店舗・どの月のものかが分からなくなる。元のファイル名(sales_202604_tokyo.csv)には年月も拠点も入っているのに、中身のCSVには「カテゴリ」と「金額」しか列が無い、というのはよくある話。結局、ファイルごとに手で「拠点」「年月」列を足して回ることになる。

これ、フォルダ内の全CSVを一括で読み込んで縦結合し、ファイル名から拠点・年月を補完し、項目別に集計してサマリCSVに出す——ここまで全部スクリプト一本で終わります。


After:スクリプト一本で完了

進め方は ①フォルダ内の全CSVを縦に結合して1枚に出力 → ②結合データを項目別に集計(件数・合計・平均)→ ③ファイル名から属性(年月・拠点)を補完して列追加 → ④ヘッダー不一致・文字コード混在への対処 の順です。

この記事では、各店舗から届く売上CSVが C:\sales(macOS/Linuxなら ~/sales)に集まっている前提で進めます。各CSVの中身はこんな形です。

sales_202604_tokyo.csv

category,amount
家電,150000
食品,80000
家電,50000
衣料,30000

sales_202604_osaka.csv

category,amount
食品,120000
衣料,60000
家電,90000

sales_202605_tokyo.csv

category,amount
家電,100000
食品,70000
衣料,40000

ファイル名は sales_{年月}_{拠点}.csv という規則になっている、という想定です(レシピ3でここから年月・拠点を取り出します)。各CSVは1行目がヘッダー(category,amount)です。

レシピ1:フォルダ内の全CSVを縦に結合して1枚のCSVに出力する

まずは「全CSVを縦にくっつけて1枚にする」だけのシンプルなレシピです。

# ===== 設定 =====
$targetDir = "C:\sales"                 # CSVが集まっているフォルダ
$pattern   = "sales_*.csv"              # 結合対象のファイル名パターン
$outCsv    = "C:\sales\_merged.csv"     # 出力先(結合後の1枚)

# ===== 本体 =====
# 対象CSVを1つずつ読み込み、全行をまとめる
$merged = Get-ChildItem -LiteralPath $targetDir -File -Filter $pattern |
    ForEach-Object { Import-Csv -LiteralPath $_.FullName }

# 1枚のCSVに書き出す
$merged | Export-Csv -LiteralPath $outCsv -Encoding UTF8BOM -NoTypeInformation

Write-Host "結合完了: $outCsv$($merged.Count) 行)"

Import-Csv は1ファイルを「行=オブジェクト」の配列にして返します。それを全ファイルぶん ForEach-Object でつなげれば、縦結合されたひとつの配列 $merged になります。上のサンプル3ファイル(4行+3行+3行)なら、結合後は 10行 です。

結合完了: C:\sales\_merged.csv(10 行)

出力された _merged.csv の中身(ヘッダーは1行に統合されます):

category,amount
家電,150000
食品,80000
家電,50000
衣料,30000
食品,120000
衣料,60000
家電,90000
家電,100000
食品,70000
衣料,40000

これだけで「144枚を手でコピペ結合」の部分は終わりです。ただ、このままだと「どの行がどの拠点・どの月か」が分かりません。それはレシピ3で解決します。先に、結合データの集計からいきましょう。

レシピ2:結合データを項目別に集計する(件数・合計・平均)

結合した $merged を、カテゴリ別に「件数・合計・平均」で集計します。Excelのピボットテーブルでやっていたことを、スクリプト側で完結させます。

# ===== 設定 =====
$targetDir = "C:\sales"
$pattern   = "sales_*.csv"

# ===== 本体 =====
$merged = Get-ChildItem -LiteralPath $targetDir -File -Filter $pattern |
    ForEach-Object { Import-Csv -LiteralPath $_.FullName }

# カテゴリ別に集計(合計の大きい順)
$merged |
    Group-Object category |
    Select-Object `
        @{Name='Category'; Expression={ $_.Name }},
        @{Name='Count';    Expression={ $_.Count }},
        @{Name='SumYen';   Expression={ ($_.Group | Measure-Object { [double]$_.amount } -Sum).Sum }},
        @{Name='AvgYen';   Expression={ [math]::Round(($_.Group | Measure-Object { [double]$_.amount } -Average).Average, 2) }} |
    Sort-Object SumYen -Descending |
    Format-Table -AutoSize

出力イメージ:

Category Count  SumYen   AvgYen
-------- -----  ------   ------
家電         4  390000    97500
食品         3  270000    90000
衣料         3  130000 43333.33

⚠️ ここが今回の最重要ポイントです。Import-Csv が返す amount数値ではなく文字列"150000" のような文字列)です。何もせず Measure-Object amount -Sum とすると、PowerShellは文字列を合計しようとして意図しない結果や0になります。そこで Measure-Object { [double]$_.amount } のように [double] で明示的に数値へキャストしてから合計・平均しています。この一手間が抜けると売上集計が静かに壊れます(詳細は後述の要点解説)。

数字を手で検算しておくと、家電は 150000+50000+90000+100000=390000(4件、平均97500)、食品は 80000+120000+70000=270000(3件、平均90000)、衣料は 30000+60000+40000=130000(3件、平均43333.33)。全カテゴリ合計は 390000+270000+130000=790000、総件数は10件で、結合した10行と一致します。

レシピ3:ファイル名から属性(年月・拠点)を補完して列追加する

ここが手作業だと一番だるい部分です。各行に 「年月」「拠点」 列を足してから結合します。ファイル名 sales_202604_tokyo.csv には年月(202604)と拠点(tokyo)が入っているので、ここから取り出して各行に付与します。

# ===== 設定 =====
$targetDir = "C:\sales"
$pattern   = "sales_*.csv"
$outCsv    = "C:\sales\_merged_with_attr.csv"

# ===== 本体 =====
$merged = Get-ChildItem -LiteralPath $targetDir -File -Filter $pattern |
    ForEach-Object {
        $file = $_
        # ファイル名(拡張子なし)を "_" で分割: sales / 202604 / tokyo
        $parts  = $file.BaseName -split '_'
        $ym     = $parts[1]   # 年月(202604)
        $branch = $parts[2]   # 拠点(tokyo)

        # 各行に YearMonth / Branch 列を追加して返す
        Import-Csv -LiteralPath $file.FullName | ForEach-Object {
            $_ | Select-Object `
                @{Name='YearMonth'; Expression={ $ym }},
                @{Name='Branch';    Expression={ $branch }},
                category,
                @{Name='Amount';    Expression={ [int]$_.amount }}
        }
    }

# 属性付きで1枚に出力
$merged | Export-Csv -LiteralPath $outCsv -Encoding UTF8BOM -NoTypeInformation

Write-Host "属性付きで結合: $outCsv$($merged.Count) 行)"

出力された _merged_with_attr.csv はこうなります(各行に年月・拠点が付きました)。

YearMonth,Branch,category,Amount
202604,tokyo,家電,150000
202604,tokyo,食品,80000
202604,tokyo,家電,50000
202604,tokyo,衣料,30000
202604,osaka,食品,120000
202604,osaka,衣料,60000
202604,osaka,家電,90000
202605,tokyo,家電,100000
202605,tokyo,食品,70000
202605,tokyo,衣料,40000

ここまでくれば、属性ごとの集計は自由自在です。拠点別年月別を出してみます。

# レシピ3の $merged を使い回す(YearMonth / Branch / category / Amount 列を持つ)

# --- 拠点別の集計 ---
Write-Host "===== 拠点別 ====="
$merged |
    Group-Object Branch |
    Select-Object `
        @{Name='Branch';  Expression={ $_.Name }},
        @{Name='Count';   Expression={ $_.Count }},
        @{Name='SumYen';  Expression={ ($_.Group | Measure-Object Amount -Sum).Sum }} |
    Sort-Object SumYen -Descending |
    Format-Table -AutoSize

# --- 年月別の集計 ---
Write-Host "===== 年月別 ====="
$merged |
    Group-Object YearMonth |
    Select-Object `
        @{Name='YearMonth'; Expression={ $_.Name }},
        @{Name='Count';     Expression={ $_.Count }},
        @{Name='SumYen';    Expression={ ($_.Group | Measure-Object Amount -Sum).Sum }} |
    Sort-Object YearMonth |
    Format-Table -AutoSize
===== 拠点別 =====
Branch Count SumYen
------ ----- ------
tokyo      7 520000
osaka      3 270000

===== 年月別 =====
YearMonth Count SumYen
--------- ----- ------
202604        7 580000
202605        3 210000

ここでは Amount 列を レシピ3の時点で [int] にキャスト済みなので、集計側では Measure-Object Amount -Sum と素直に書けています(毎回キャストしなくてよい)。属性付与の段階で数値型にしておくと、後続の集計がスッキリします。

検算:拠点別は tokyo が 150000+80000+50000+30000+100000+70000+40000=520000(7件)、osaka が 120000+60000+90000=270000(3件)。年月別は 202604 が 310000(tokyo)+270000(osaka)=580000(7件)、202605 が 210000(3件)。どちらも総計 790000 / 10件で一致します。

複数キーでのクロス集計(拠点×カテゴリ)Group-Object にキーを2つ渡すだけです。

# レシピ3の $merged を使い回す
$merged |
    Group-Object Branch, category |
    Select-Object `
        @{Name='Branch';   Expression={ $_.Group[0].Branch }},
        @{Name='Category'; Expression={ $_.Group[0].category }},
        @{Name='Count';    Expression={ $_.Count }},
        @{Name='SumYen';   Expression={ ($_.Group | Measure-Object Amount -Sum).Sum }} |
    Sort-Object Branch, Category |
    Format-Table -AutoSize
Branch Category Count SumYen
------ -------- ----- ------
osaka  家電         1  90000
osaka  衣料         1  60000
osaka  食品         1 120000
tokyo  家電         3 300000
tokyo  衣料         2  70000
tokyo  食品         2 150000

検算:tokyo/家電は 150000+50000+100000=300000(3件)、tokyo/食品は 80000+70000=150000(2件)、tokyo/衣料は 30000+40000=70000(2件)。osaka側は各1件で 90000 / 60000 / 120000。全6グループの合計は 790000・件数10件で一致します。

レシピ4:ヘッダー不一致・文字コード混在への対処

現場のCSVは綺麗に揃っていません。ヘッダー名の表記ゆれamountAmount金額)や、文字コードの混在(Shift_JISのファイルとUTF-8のファイルが混在)が普通に起きます。代表的な2パターンへの対処です。

(a) ヘッダーが無い/表記ゆれがある → -Header で列名を強制する

ヘッダー行が無いCSV、あるいはファイルごとに列名が違うCSVは、Import-Csv -Header列名を自分で与えて読み込むと揃えられます(既存のヘッダー行があるときは Select-Object -Skip 1 で1行目を読み飛ばします)。

# ヘッダー無しCSVに、こちらで列名を付けて読む
Import-Csv -LiteralPath $file.FullName -Header 'category', 'amount'

(b) Shift_JISのCSVが混ざっている → -Encoding で明示する

Import-CsvPowerShell 7 では既定UTF-8 で読みます。Shift_JIS(日本語Windowsの旧来CSV)が混ざると日本語が文字化けするため、そのファイルだけ -Encoding を指定します。

# Shift_JIS のCSVを読むとき(PowerShell 7)
Import-Csv -LiteralPath $file.FullName -Encoding Default   # 旧来のShift_JIS/ANSI想定

Default は「OSの既定コードページ(日本語環境ではShift_JIS系)」を指します。UTF-8とShift_JISがフォルダ内に混在している場合は、ファイルごとにエンコードを判定するのは難しいので、事前に全CSVをUTF-8に揃えておくのが結局いちばん確実です。揃え方の例は後述します。

ヘッダーの表記ゆれを吸収して結合したい場合は、読み込み後に列名を正規化してから縦結合します。

# ===== 設定 =====
$targetDir = "C:\sales"
$pattern   = "sales_*.csv"

# ===== 本体 =====
$merged = Get-ChildItem -LiteralPath $targetDir -File -Filter $pattern |
    ForEach-Object {
        Import-Csv -LiteralPath $_.FullName | ForEach-Object {
            # 列名がファイルごとに amount / Amount / 金額 とブレても拾えるように寄せる
            $amountRaw = if ($null -ne $_.amount) { $_.amount }
                         elseif ($null -ne $_.Amount) { $_.Amount }
                         else { $_.金額 }

            [pscustomobject]@{
                category = $_.category
                Amount   = [int]$amountRaw
            }
        }
    }

Write-Host "正規化して結合: $($merged.Count) 行"

[pscustomobject]@{ ... }列名・型を自分で組み直した新しい行オブジェクトを作っているのがポイントです。入力側の列名がブレていても、出力側は category / Amount(数値)に統一されます。


コードの要点解説(なぜこの書き方か)

文法そのものではなく、現場でハマらないための選択を中心に解説します。

1. 【最重要】Import-Csv の値は全部「文字列」。合計前に必ず数値へキャストする

これが今回いちばんの落とし穴です。Import-Csv が返す各列の値は、見た目が数字でも すべて文字列(String) です。文字列のまま Measure-Object -Sum に渡すと、合計が意図せず0になったり、足し算にならなかったりします。

# ❌ これは危険:amount は文字列なので、合計が意図通りにならない
($_.Group | Measure-Object amount -Sum).Sum

# ✅ 正解:[double] や [int] で数値に変換してから合計
($_.Group | Measure-Object { [double]$_.amount } -Sum).Sum
  • 金額・在庫数のように整数で十分なら [int]、小数や桁あふれが怖いなら [double] を使います(合計が [int] の上限 約21億 を超えそうなら [double][long])。
  • レシピ3のように読み込んだ直後に [int]$_.amount で数値列を作っておくと、後続の集計で毎回キャストせずに済み、ミスも減ります。「入口で数値化する」のが定石です。

「集計したのに合計が0」「平均がおかしい」のほとんどは、このキャスト漏れが原因です。

2. Import-CsvForEach-Object で縦結合する仕組み

Import-Csv は1ファイルを「ヘッダーを列名に持つオブジェクトの配列」にして返します。Get-ChildItem ... | ForEach-Object { Import-Csv ... } とすると、各ファイルの行オブジェクトがパイプラインに次々と流れて1本の列になり、これが縦結合の実体です。$merged に受ければ全ファイルの全行が入った配列になります。Excelで下へ下へ貼り付けていた作業と等価です。

3. ファイル名からの属性抽出は BaseName -split '_'

$_.BaseName は拡張子を除いたファイル名(sales_202604_tokyo)です。-split '_'_ 区切りに分解すると @('sales', '202604', 'tokyo') になり、[1] が年月、[2] が拠点です。命名規則が決まっているなら、このファイル名は立派なメタデータ。中身に無い属性をファイル名から補えます。区切り文字や桁が違うなら、-split のパターンや添字を合わせて調整してください(区切りが安定しないなら正規表現 -match の方が堅い場合もあります)。

4. Group-Object に複数キーを渡すとクロス集計になる

Group-Object Branch, category のようにキーをカンマ区切りで複数渡すと、その組み合わせごとにグルーピングします(拠点×カテゴリのマトリクス集計)。各グループの代表値は $_.Group[0].Branch のように、グループ内の先頭行から取り出すのが簡単です(同じグループ内なら Branch も category も同値なので先頭でよい)。

5. Measure-Object-Sum / -Average、丸めは [math]::Round

Measure-Object-Sum(合計)・-Average(平均)・-Maximum / -Minimum-Count をまとめて出せます。平均は割り切れないと小数が長く続くので、[math]::Round(値, 2) で小数2桁に丸めると台帳として読みやすくなります(衣料の平均 130000 / 3 = 43333.33...43333.33)。

6. 出力CSVは第3回と同じく -Encoding UTF8BOM

集計結果を Export-Csv でCSVにするときは、第3回と同様に -Encoding UTF8BOM を付けます。日本語(カテゴリ名・拠点名)を含むCSVをExcelでダブルクリックして開いても文字化けしません。-NoTypeInformation で先頭の型情報行も抑制します(5.1との両対応のため明示。理由は第3回参照)。


応用・注意点

① 出力先CSVの「上書き」と「自分自身を読み込む事故」

Export-Csv は出力先に同名ファイルがあると 確認なしで上書きします(破壊的ではありませんが、前回の結合結果は消えます)。履歴を残したいなら日時をファイル名に入れます。

$stamp  = Get-Date -Format "yyyyMMdd_HHmmss"
$outCsv = "C:\sales\_merged_$stamp.csv"   # 例: _merged_20260628_103000.csv

さらに注意したいのが、出力CSV(_merged.csv)を対象フォルダの中に置くと、次回の結合で自分自身を読み込んでしまうことです。今回は -Filter "sales_*.csv"sales_ 始まりだけを対象にしているので _merged.csv は拾われませんが、パターンを緩めるときは要注意。心配なら出力先をフォルダ外にするか、明示的に除外します。

Get-ChildItem -LiteralPath $targetDir -File -Filter "*.csv" |
    Where-Object { $_.Name -notlike '_merged*' }

② 数値が文字列として読まれる罠(再掲・最重要)

要点解説1のとおり、Import-Csv の値は全部文字列です。合計・平均の前に [int] / [double] でキャストする。これだけは絶対に忘れないでください。特に「桁区切りカンマ入りの金額("1,500,000")」は、そのまま [int] するとエラー or 想定外の値になります。カンマを除去してからキャストします。

# "1,500,000" のような桁区切りカンマ入りを数値化
[int]($_.amount -replace ',', '')

③ 空行・欠損値(空セル)への対処

集計対象の列がだったり、行全体が空だったりすると、キャストでエラーになったり、平均の母数がずれたりします。集計前に「金額が空でない行だけ」に絞ると安全です。

$merged |
    Where-Object { $_.amount -and $_.amount.Trim() -ne '' } |
    # この後に Group-Object / Measure-Object を続ける
    Group-Object category | # ...

Import-Csv は通常、完全な空行はスキップしますが、カンマだけの行(,)や末尾の余分な改行は環境次第で1行として入ることがあります。重要な集計の前には「件数が想定と合うか」を必ず確認してください。

④ 区切り文字がカンマでない場合(タブ・セミコロン)

CSVと言いつつタブ区切り(TSV)やセミコロン区切りのファイルもよくあります(ヨーロッパ系システムの出力はセミコロンが多い)。Import-Csv / Export-Csv-Delimiter で区切り文字を指定できます。

# タブ区切りを読む(`t はタブ文字)
Import-Csv -LiteralPath $file.FullName -Delimiter "`t"

# セミコロン区切りを読む
Import-Csv -LiteralPath $file.FullName -Delimiter ';'

タブは PowerShell では `t(バッククォート+t)で表します。区切りを取り違えると「全列が1列にまとまった」状態で読み込まれるので、読み込み直後に1行 Format-List で列が分かれているか確認すると安心です。

⑤ 文字コードを事前にUTF-8へ揃える

Shift_JISとUTF-8が混在していて扱いづらいときは、集計前に全CSVをUTF-8へ揃える前処理を1回かけてしまうのが結局ラクです。

# C:\sales 内の *.csv を Shift_JIS とみなして読み、UTF8BOM で上書き保存し直す
Get-ChildItem -LiteralPath "C:\sales" -File -Filter "*.csv" | ForEach-Object {
    $content = Get-Content -LiteralPath $_.FullName -Encoding Default   # 旧Shift_JISとして読む
    Set-Content -LiteralPath $_.FullName -Value $content -Encoding UTF8BOM
}

上書き保存するので、元ファイルは事前にバックアップを取ってから実行してください(Copy-Item -Recurse でフォルダごと退避)。混在ではなく「全部Shift_JIS」だと分かっているなら、この前処理は不要で、Import-Csv -Encoding Default で読むだけで済みます。

⑥ Windows PowerShell 5.1 との差異

本記事のスクリプトは、コアな部分(結合・キャスト・集計)は 5.1 でもそのまま動作します。違いは主にエンコードまわりです(第3回と同じ整理です)。

項目 PowerShell 7(pwsh) Windows PowerShell 5.1
Import-Csv の既定エンコード UTF-8 環境の既定(多くはShift_JIS/ANSI)
Export-Csv の既定エンコード UTF-8(BOMなし) 環境の既定(多くはShift_JIS/ANSI)
-Encoding UTF8BOM の指定 利用可(BOM付きUTF-8) 指定不可(値が存在しない)
-NoTypeInformation 既定で型情報行は付かない(付けても無害) 付けないと #TYPE ... 行が入る → 付けるのが必須
[int]/[double] での数値キャスト 必要(文字列のため) 同じく必要(5.1でも Import-Csv の値は文字列)

数値キャストの必要性は 5.1でも同じです(バージョンを問わず Import-Csv の値は文字列)。違うのはエンコード指定の書き方で、5.1でUTF-8(BOM付き)のCSVを出したいときは、第3回で紹介した [System.IO.File]::WriteAllLinesUTF8Encoding($true) を使うか、可能なら PowerShell 7 を入れて -Encoding UTF8BOM に統一するのが手堅いです。

# 【5.1向け】UTF-8(BOM付き)で集計結果を出したいときの例
$csv = $summary | ConvertTo-Csv -NoTypeInformation
$utf8Bom = New-Object System.Text.UTF8Encoding($true)   # $true = BOM付き
[System.IO.File]::WriteAllLines("C:\sales\_summary.csv", $csv, $utf8Bom)

まとめ

  • 縦結合は Get-ChildItem | ForEach-Object { Import-Csv ... } で全行を1本の配列に集める
  • Import-Csv の値は全部文字列。合計・平均の前に [int] / [double] で数値キャスト(これを忘れると集計が静かに壊れる)
  • ファイル名からの属性補完は BaseName -split '_'、入口で [int] 化しておくと後続がラク
  • 集計は Group-Object(複数キーでクロス集計可)+ Measure-Object -Sum/-Average、平均は [math]::Round(..., 2)
  • 表記ゆれは [pscustomobject]@{...} で列名・型を組み直して正規化、区切りは -Delimiter、文字コードは -Encoding/事前にUTF-8へ統一
  • 5.1 は 既定エンコードが違うUTF8BOM が使えない-NoTypeInformation が必要数値キャストはバージョン問わず必須

これで、半日かけていた「拠点×月のCSVをコピペ結合してピボット集計」が、コマンド一本・数秒で再現性をもって出せるようになります。

次回 第5回は「Excelを開かずにセル値を読み書き」ImportExcel モジュールで .xlsx のセルを直接読み書きし、テンプレートExcelへの転記や既存ブックの値更新を、Excelを一度も起動せずに自動化するレシピを扱います。お楽しみに。


参考


@kotaro_ai_lab
AI活用や開発効率化について発信しています。フォローお気軽にどうぞ!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?