大掛かりなものでなくても日常のちょっとした繰り返し業務を効率化(自動化)できるかを考えている方は多いと思います。
この記事では、以下のような方を対象に、InDesignのデータ結合を題材として、どうやってExcelデータを整形するか、というちょっとしたお話を仰々しくお伝えしていきます!
-
Excelデータを整形して他の用途に利用したい人
-
Excel、InDesignの基本的な操作が調べながらでもできる人
-
プログラミング(Python)初学者 ※自分でプログラムを組んだことがない人
-
ChatGPTを使ったことがある人
まずは、現状把握。何をしたいかを整理しよう
Adobeの組版ソフトであるInDesignには名刺や名簿など定型のデータを自動で組版できるデータ結合という機能が備わっています。
詳しくはAdobeのヘルプをご覧ください。過去の記事でもデータ結合について詳しく紹介しています。
この機能を使用するには、データ結合の設定をしたInDesignデータと、データソースとしてcsvデータかタブ区切りテキストデータを用意する必要があります。
InDesignでのデータ結合の設定は、InDesignを使ったことがある人にとってはそれほど難しくはないですが、Excelデータなどのデータソースを整形するのは思った以上に時間がかかります。
なぜならクライアントから支給されるデータが、データ結合に適した形式になっているとは限らないからです。
まずは、InDesignデータのフォーマットに自動で流し込めるようにテキストデータを整形したいと思います。
テキストデータをデータ結合に適した形式にするには、1行目に項目見出しが入り、2行目以降にデータを配置する順で並べておく必要があります。
Excelデータはこのような形式で支給されました。こちらをデータ結合に適した形式にするために内容を整理していきます。
違いを調べてみる
支給されたExcelデータとデータ結合に適した形式との違いを洗い出してみます。
-
1人分のデータで1ファイルになっている……1ファイルに全頁分のデータが含まれる
-
取得したい項目の内容が縦に並んでいる…… 1人分のデータが横(1行)に並んでいる
- C6からC13に取得したいテキストがある……A列からH列にテキストがある
-
ワークシート内には必要のない文字や画像も含まれている……必要なテキストだけにする
処理としては、このExcelデータを1つずつ開いてC6からC13の範囲を選択してコピーして、別のファイルやシートに形式を選択して貼り付け→行/列の入れ替えでペースト、の繰り返し…。
気が遠くなりそうですね。
とりあえず現状のExcelデータと完成形(データ結合に適した形式)との違いと、それをどう処理すればいいかがわかったところで、この作業をどのように自動化すればいいか考えていきたいと思います。
自分のスキルでできそうなことをやってみる
Excelに長けている人やプログラミングができる人は、すぐにでも解決できるレベルの内容だと思いますが、筆者のスキルでは簡単には解決できません。
筆者のスキルレベル
- Excel…調べながらやればある程度のことはできるが、VBAは簡単なサンプルコードを試したことがあるだけ。
- Python…書籍や学習サイトで1年ぐらいすき間を見て勉強中。コードはある程度読めるが、まだ1人でプログラムを組めない。
- InDesign…忘れかけてる。
このスキルで自動化ツールを選ぶなら、VBAかPython、RPAなどが選択肢になりそうですが、どれも現状では不十分なレベル。
Excelでの整形なのでこの中ではVBAが1番適していそうですが、せっかく勉強してるのでPythonでやってみることにしました。
Pythonの開発環境
mac OS 13.6.1
JupyterLab Desktop 4.0.7-1
Python 3.10.5
念の為、VBAとPythonでこのような整形条件の記事があるかWebで検索してみましたが、どれも帯に短し襷に長し。調べ方が悪かったのかフォルダ内のファイルをまとめて行/列を入れ替えて整形する、という記事やサンプルコードはありませんでした。
勉強中のPythonの書籍にも何冊か目を通しましたが、さすがにぴったり当てはまるものはありませんでした。
それでも自分なりにコードを組み合わせたりして試してみましたが、どうもうまく動かず。
やっぱり自分にはまだ無理なのかな…と諦めかけていましたが、ChatGPTの存在を思い出しました。
うまくいかない? そこでChatGPTの登場です
無料版のアカウントはすでに作っていたので、試す準備はできています。
今や有償版では、Advanced Data Analysis(Code Interpreter)なるものが実装されています。
また、Copilot in Excel(日本語未対応)も法人向けとして11月1日から実装されています。
これらを使えばすぐに解決できそうですが、この記事の意味がなくなってしまうのでGPT-3.5を使用しますよ。無料だし。
ChatGPTに指示を出してみる
プロンプトだけで指示するのは難しそうだし、それで生成されたコードを理解できないと(自分の勉強のために)意味がないので、まずは自分で書いて失敗したコードを見せて修正してもらうようにしました。
あっという間にコードを修正してくれました。
import os from openpyxl import load_workbook from openpyxl import Workbook from openpyxl.utils.dataframe import dataframe_to_rows import pandas as pd # 1. 整形前と整形結果の列のタイトルを定義 columns = ["お名前", "フリガナ", "ローマ字", "大学名", "学部 学科名", "出身地(都道府県)", "趣味/特技", "頑張ったこと"] # 2. 新しいExcelファイルを作成 new_workbook = Workbook() new_worksheet = new_workbook.active new_worksheet.append(columns) # booksフォルダ内のExcelファイルを読み込む folder_path = "./books" for filename in os.listdir(folder_path): if filename.endswith(".xlsx"): filepath = os.path.join(folder_path, filename) workbook = load_workbook(filepath) worksheet = workbook.active # C6からC13の値を読み取り、整形結果のリストに追加 values = [] for row in worksheet.iter_rows(min_row=6, max_row=13, min_col=3, max_col=3): for cell in row: values.append(cell.value) new_worksheet.append(values) # 3. 整形結果を新しいExcelファイルに書き込む new_filename = "matome.xlsx" new_filepath = os.path.join(folder_path, new_filename) new_workbook.save(new_filepath)
なるほどね、pandasを使うのか(わかってない)。あれ、でもpandasの関数使ってないぞ。
※必要のないコードも生成されることもあるようなので生成結果をよく確認しましょう。
では、さっそくサンプル用のExcelデータを用意して、Pythonのスクリプトを「実行!」
同じフォルダ内に、matome.xlsxができてる。恐る恐る開いてみると…。
なんと! 1発でやりたかったことをやってくれました。今までの苦労はなんだったんだ!?
プログラムが思い通りに動くとすごく気分がいい。ここ最近で1番うれしかった出来事かも。
こんなにすぐにうまくいくのなら、と試しに同じプロンプトでコードを丸ごとChatGPTに書いてもらいました。
なになに、"input_directory"のところに処理したいフォルダのパスをいれて、"output_directory"に書き出す場所のパスを入れればいいのかな。
では、「実行!」
動いた! が、しかし未熟なプロンプトエンジニアリング力が…。1ファイルずつ書き出されてしまったので、再度指示を。
念のため、ワークシートがアクティブなものを抽出するように指示しました(ファイル名を昇順にソートして読み込む指示は忘れてる)。
再度フォルダを指定して、「実行!」
今度はうまくいきました! "combined_data.xlsx"というファイルでしっかり1つのファイルに書き出されました。
まとめ
いかがだったでしょうか。プログラミングを勉強中の人でも、うまくChatGTPを使えば、簡単な整形ならできそうな気がしませんか?
自分で仕事の効率化ができるようになるというのは、うれしいものですよね。
今回はExcelデータをInDesignのデータ結合用に整形しましたが、他の用途でも整形する機会はたくさんあるのではないでしょうか。
タクトシステムでは、InDesignを使用した、自動組版ソフト(MyAutoPub)やスクリプトを使った大規模の自動組版はもちろん、自動化が難しい組版も得意としています。
お手伝いできることがありましたら、ぜひご相談ください。