LoginSignup
0
0

More than 3 years have passed since last update.

GASで『できる日本語』のイラストデータCD-ROMから説明と絵をスライドへ交互に貼り合わせる

Last updated at Posted at 2021-04-03

はじめに

日本語を教える時、「絵カード」があると便利です。
あらかじめiPadやパソコンに保存しておいてそれを見せる方法もありますが、
プリントアウトしてラミネート加工さえしておけば何度でも使えますし、
学生の前でパソコンがフリーズして動かない等の技術に依存したトラブルを避けることができます。紙の場合、なにより表示速度がダントツで早いのも魅力ですね。

今回は『できる日本語』のイラストデータCD-ROMの初級編と初中級編を使って、この「絵カード」を作っていく。

初級編と初中級編を合わせると、画像枚数が2000枚近くに上る。
このCD-ROMはとても親切で、エクセル形式のデータも付属している。
画像1枚ごとに「どの単元か」「学習事項は何か」などの細かい説明が表形式でまとめられている。
そこで、以下のものを作ることにした。

作りたいもの

両面印刷すると、表面が絵、裏面が絵の説明、となるようなPDFファイルを生成する。
サイズはA4。課ごとにファイルを分ける。

完成形の画像は以下の通りです。(権利の都合上、絵カード部分はぼかしてあります)
tempsnip.png

手作業でやろうとすると、 4000枚分のスライドを手作業で行うなんてことになります。

作る

Adobe AcrobatとGoogle Apps Scriptを使う。
CD-ROMはレッスンごとにフォルダ分けされていて、PDFは1画像につき1PDFファイルになっていた。
そこで、PDFと同じファイル名の画像を作り、画像ファイルとリストのファイル名欄とを照合し、
同じであればリストの同じ行の他の欄にある説明をスライドに追加していく流れで作ることにした。

PDFをA4の画像にする。

Windowsの場合、まず表示を「名前順」に並び替える。後でリネームする時にこの順番が重要になる。(理由は後述)それから全選択し、
Adobe Acrobat Proの「結合」機能にドロップして、pdfを1つのpdfにまとめる。
そのまま保存せずに、「印刷」メニューからA4のPDFにする。
作成されたファイルをjpegにエクスポートして、フォルダ別に保存。フォルダ名は「L01_img」「L02_img」...とした。
これを手作業でレッスンごとに行う。CD2枚合わせて30回行った。

画像ファイルのリネーム準備

順番が狂うと木村さんがスーツケースになったりするので、その対策を行う。
Windowsエクスプローラーの場合、
pdfのファイルがあるフォルダ内のファイルを全選択してから「Shift+右クリック」でパスのコピーを選択。VS Code等のエディタに貼り付け、正規表現で配列用に形を整える。

"D:\~\dekiru2_guideill\00\00_TJ_1.pdf" のようなアドレスがずらっと並ぶ。レッスンごとに2つの空白行を挟んでいる。
私は正規表現ちょっとしかできないので、次の方法で置換を行った。

(".*")$1,に置換、.*Thumbs.db",に置換、,\n\n],\n\nに置換、\n\n"\n\n["に置換、手入力で1行目の頭に [ を追加、".+\\(\d{2})"$1に置換、\nに置換。、最終行の,を削除。

ファイルのアップロード

次に画像ファイルとdekiru_ill_all.xlsxをGoogle Driveにアップロードする。
画像ファイルはどこかに専用のフォルダを作って、そこに15レッスン分入れた。
cd1 > image > L01_imgといった具合に。
dekiru_ill_all.xlsxは一度Drive上で開いて、スプレットシート形式に変換し、Google Drive上の元のExcelファイルは削除した。

画像ファイルの一括リネーム

PDFと画像を同じ名前にする。ある画像ファイルがそのPDFファイルと同じ画像かどうかの判定は、順番で行った。順番がズレていたらアウトである。(付属Excelファイルの順番はWindowsの順番と異なるため、Excelから持ってくることはしなかった。)

スプレットシートになったdekiru_ill_allを開き、ツール > スクリプトエディタ でエディタを開き、コードを書いていく。

まずはpdfファイル名の配列を追加する。後にこの配列を使って画像ファイル名を変更していく。
見通しを良くしたいので、左のメニューで「ファイル」の隣にある「+」を押し、「スクリプト」を選択。ファイル名をdata.gsとして別ファイルにし、次の方法でファイル名データを入れた。

data.js
function getWinSortFileNames() {
  const fileNameLists= [["00_TJ_1.pdf","00_TJ_2.pdf","00_TJ_3.pdf","00_TJ_4.pdf","00_TJ_5.pdf","00_TJ_6.pdf","00_TJ_7.pdf","00_TJ_8.pdf","00_TJ_9.pdf","00_TJ_10.pdf","00_TJ_11.pdf","00_TJ_12.pdf","00_TJ_13.pdf","00_TJ_14.pdf","00_TJ_15.pdf","00_TJ_16.pdf","00_TJ_17.pdf","00_TJ_18.pdf","00_TJ_19.pdf","00_TJ_20.pdf","00_TJ_21.pdf","00_TJ_22.pdf","00_TJ_23.pdf"],["01_0_HN_1.pdf","01_0_HN_2.pdf","01_0_HN_3.pdf","01_1_B_1_0_1.pdf","01_1_B_1_0_2.pdf","01_1_B_1_1.pdf","01_1_B_1_2.pdf","01_1_B_1_3.pdf","01_1_B_1_4.pdf","01_1_B_2_0.pdf","01_1_B_2_1.pdf","01_1_B_2_2.pdf","01_1_CJ_1.pdf","01_1_CJ_2.pdf","01_1_CK_1.pdf","01_1_CK_2.pdf","01_1_CK_3_1.pdf","01_1_CK_3_2.pdf","01_1_CK_4.pdf","01_1_CK_5.pdf","01_1_CK_6.pdf","01_1_IT_1_0.pdf","01_1_IT_1_1.pdf","01_1_IT_1_2.pdf","01_1_IT_1_3.pdf","01_1_IT_1_4.pdf","01_1_IT_5_0.pdf","01_1_IT_5_1.pdf","01_1_IT_5_2.pdf","01_1_IT_5_3.pdf","01_1_IT_6_0.pdf","01_1_IT_6_1.pdf","01_1_IT_6_2.pdf","01_1_IT_6_3.pdf","01_1_IT_6_4.pdf","01_1_YT_1.pdf","01_1_YT_2.pdf","01_2_B_3_R1_0.pdf","01_2_B_3_R1_1.pdf","01_2_B_3_R1_2.pdf","01_2_B_3_R1_3.pdf","01_2_B_3_R1_4.pdf","01_2_B_3_R2_0.pdf","01_2_B_3_R2_1.pdf","01_2_B_3_R2_2.pdf","01_2_B_3_R2_3.pdf","01_2_B_3_R2_4.pdf","01_2_CJ.pdf","01_2_CK_1-1_1.pdf","01_2_CK_1-1_2.pdf","01_2_CK_1-2.pdf","01_2_CK_2_1.pdf","01_2_CK_2_2.pdf","01_2_CK_3_1.pdf","01_2_CK_3_2.pdf","01_2_IT_1-1_0.pdf","01_2_IT_1-1_1.pdf","01_2_IT_1-1_2.pdf","01_2_IT_1-1_3.pdf","01_2_IT_1-1_4.pdf","01_2_IT_1-2_0.pdf","01_2_IT_1-2_1.pdf","01_2_IT_1-2_2.pdf","01_2_IT_1-2_3.pdf","01_2_IT_3_0.pdf","01_2_IT_3_1.pdf","01_2_IT_3_2.pdf","01_2_IT_3_3.pdf","01_2_IT_3_4.pdf"],["02_0_HN_1.pdf","02_0_HN_2.pdf","02_0_HN_3.pdf","02_1_B_2_0.pdf","02_1_B_2_1.pdf","02_1_B_2_2.pdf","02_1_B_2_3.pdf","02_1_B_2_4.pdf","02_1_B_2_5.pdf","02_1_B_2_6.pdf","02_1_B_3_0.pdf","02_1_B_3_1.pdf","02_1_B_3_2.pdf","02_1_B_3_3.pdf","02_1_B_3_4.pdf","02_1_B_3_5.pdf","02_1_B_4_0.pdf","02_1_B_4_1.pdf","02_1_B_4_2.pdf","02_1_B_4_3.pdf","02_1_B_4_4.pdf","02_1_B_4_5.pdf","02_1_B_4_6.pdf","02_1_B_5_0.pdf","02_1_B_5_1.pdf","02_1_B_5_2.pdf","02_1_B_5_3.pdf","02_1_B_5_4.pdf","02_1_B_5_5.pdf","02_1_B_6_0.pdf","02_1_B_6_1.pdf","02_1_B_6_2.pdf","02_1_B_6_3.pdf","02_1_B_6_4.pdf","02_1_B_6_5.pdf","02_1_CJ.pdf","02_1_CK_1_1.pdf","02_1_CK_1_2.pdf","02_1_CK_2.pdf","02_1_CK_3.pdf","02_1_CK_4.pdf","02_1_CK_5.pdf","02_1_CK_6.pdf","02_1_IT_1_0_1.pdf","02_1_IT_1_0_2.pdf","02_1_IT_1_1.pdf","02_1_IT_1_2.pdf","02_1_IT_1_3.pdf","02_1_IT_1_4.pdf","02_1_IT_6_0.pdf","02_1_IT_6_1.pdf","02_1_IT_6_2.pdf","02_1_IT_6_3.pdf","02_1_IT_6_4.pdf","02_1_IT_45_0.pdf","02_1_IT_45_1.pdf","02_1_IT_45_2.pdf","02_1_IT_45_3.pdf","02_1_IT_45_4.pdf","02_2_B_1_0.pdf","02_2_B_1_1.pdf","02_2_B_1_2.pdf","02_2_B_1_3.pdf","02_2_B_1_4.pdf","02_2_B_1_5.pdf","02_2_B_2_0.pdf","02_2_B_2_1.pdf","02_2_B_2_2.pdf","02_2_B_2_3.pdf","02_2_B_2_4.pdf","02_2_B_3_R1_0.pdf","02_2_B_3_R1_1.pdf","02_2_B_3_R1_2.pdf","02_2_B_3_R1_3.pdf","02_2_B_3_R2_0.pdf","02_2_B_3_R2_1.pdf","02_2_B_3_R2_2.pdf","02_2_B_3_R2_3.pdf","02_2_B_4_0.pdf","02_2_B_4_1.pdf","02_2_B_4_2.pdf","02_2_B_4_3.pdf","02_2_B_4_4.pdf","02_2_B_6_0.pdf","02_2_B_6_1.pdf","02_2_B_6_2.pdf","02_2_B_6_3.pdf","02_2_B_7_0.pdf","02_2_B_7_1.pdf","02_2_B_7_2.pdf","02_2_B_7_3.pdf","02_2_CJ_1.pdf","02_2_CJ_2.pdf","02_2_CK_1.pdf","02_2_CK_2.pdf","02_2_CK_3.pdf","02_2_CK_4.pdf","02_2_CK_5_1.pdf","02_2_CK_5_2.pdf","02_2_CK_6.pdf","02_2_CK_7.pdf","02_2_IT_5.pdf","02_2_IT_6_0.pdf","02_2_IT_6_1.pdf","02_2_IT_6_2.pdf","02_2_IT_6_3.pdf","02_2_IT_6_4.pdf","02_2_IT_7_0.pdf","02_2_IT_7_1.pdf","02_2_IT_7_2.pdf","02_2_IT_7_3.pdf","02_2_IT_12_0.pdf","02_2_IT_12_1.pdf","02_2_IT_12_2.pdf","02_2_IT_12_3.pdf","02_2_IT_34_0.pdf","02_2_IT_34_1.pdf","02_2_IT_34_2.pdf","02_2_IT_34_3.pdf","02_2_YT_1_a.pdf","02_2_YT_1_b.pdf","02_2_YT_1_c.pdf","02_2_YT_1_d.pdf","02_2_YT_1_e.pdf","02_2_YT_1_f.pdf","02_2_YT_2.pdf"],["03_0_HN_1.pdf","03_0_HN_2.pdf","03_0_HN_3.pdf","03_1_B_1_0.pdf","03_1_B_1_1.pdf","03_1_B_1_2.pdf","03_1_B_1_3.pdf","03_1_B_1_4.pdf","03_1_CJ.pdf","03_1_CK_1.pdf","03_1_CK_2_1.pdf","03_1_CK_2_2.pdf","03_1_CK_3.pdf","03_1_CK_4_1.pdf","03_1_CK_4_2.pdf","03_1_CK_5.pdf","03_2_B_2-1_0.pdf","03_2_B_2-1_1.pdf","03_2_B_2-1_2.pdf","03_2_B_2-1_3.pdf","03_2_B_2-2_R1_0.pdf","03_2_B_2-2_R1_1.pdf","03_2_B_2-2_R1_2.pdf","03_2_B_2-2_R1_3.pdf","03_2_CJ_1.pdf","03_2_CJ_2.pdf","03_2_CJ_3.pdf","03_2_CK_1_1.pdf","03_2_CK_1_2.pdf","03_2_CK_2-1.pdf","03_2_CK_2-2_1.pdf","03_2_CK_2-2_2.pdf","03_2_CK_3_1.pdf","03_2_CK_3_2.pdf","03_2_IT_2-1.pdf","03_2_YT_1.pdf","03_2_YT_2.pdf","03_2_YT_3.pdf","03_2_YT_4.pdf"],["04_0_HN_1.pdf","04_0_HN_2.pdf","04_0_HN_3.pdf","04_1_CJ.pdf","04_1_CK_1.pdf","04_1_CK_2.pdf","04_1_CK_3.pdf","04_1_CK_4.pdf","04_1_CK_5_1.pdf","04_1_CK_5_2.pdf","04_1_IT_5_0.pdf","04_1_IT_5_1.pdf","04_1_IT_5_2.pdf","04_1_IT_5_3.pdf","04_1_IT_5_4.pdf","04_1_IT_12_0.pdf","04_1_IT_12_1.pdf","04_1_IT_12_2.pdf","04_1_IT_12_3.pdf","04_1_IT_12_4.pdf","04_2_B_1.pdf","04_2_CJ_1.pdf","04_2_CJ_2.pdf","04_2_CK_1_1.pdf","04_2_CK_1_2.pdf","04_2_CK_2_1.pdf","04_2_CK_2_2.pdf","04_2_IT_1.pdf","04_2_IT_2_0.pdf","04_2_IT_2_1.pdf","04_2_IT_2_2.pdf","04_2_IT_2_3.pdf","04_2_YT_1.pdf","04_2_YT_2.pdf","04_2_YT_3.pdf","04_2_YT_4.pdf"],["05_0_HN_1.pdf","05_0_HN_2.pdf","05_0_HN_3.pdf","05_1_B_1_R2_0.pdf","05_1_B_1_R2_1.pdf","05_1_B_1_R2_2.pdf","05_1_B_1_R2_3.pdf","05_1_B_1_R2_4.pdf","05_1_B_1_R2_5.pdf","05_1_B_1_R2_6.pdf","05_1_B_3_R1_0_1.pdf","05_1_B_3_R1_0_2.pdf","05_1_B_3_R1_1.pdf","05_1_B_3_R1_2.pdf","05_1_B_3_R1_3.pdf","05_1_B_3_R1_4.pdf","05_1_CJ_1.pdf","05_1_CJ_2.pdf","05_1_CK_1.pdf","05_1_CK_2_1.pdf","05_1_CK_2_2.pdf","05_1_CK_2_3.pdf","05_1_CK_3-1_1.pdf","05_1_CK_3-1_2.pdf","05_1_CK_3-2_1.pdf","05_1_CK_3-2_2.pdf","05_1_IT_3-1_0.pdf","05_1_IT_3-1_1.pdf","05_1_IT_3-1_2.pdf","05_1_IT_3-1_3.pdf","05_1_IT_3-1_4.pdf","05_1_IT_3-2_0.pdf","05_1_IT_3-2_1.pdf","05_1_IT_3-2_2.pdf","05_1_IT_12_0.pdf","05_1_IT_12_1.pdf","05_1_IT_12_2.pdf","05_1_IT_12_3.pdf","05_1_IT_12_4.pdf","05_1_YT_1.pdf","05_1_YT_2.pdf","05_1_YT_3.pdf","05_2_B_1_0.pdf","05_2_B_1_1.pdf","05_2_B_1_2.pdf","05_2_B_1_3.pdf","05_2_B_1_4.pdf","05_2_B_1_5.pdf","05_2_B_1_6.pdf","05_2_B_1_7.pdf","05_2_B_3_0.pdf","05_2_B_3_1.pdf","05_2_B_3_2.pdf","05_2_B_3_3.pdf","05_2_B_3_4.pdf","05_2_B_3_5.pdf","05_2_CJ_1.pdf","05_2_CJ_2.pdf","05_2_CK_1_1.pdf","05_2_CK_1_2.pdf","05_2_CK_1_3.pdf","05_2_CK_2_1.pdf","05_2_CK_2_2.pdf","05_2_CK_3.pdf","05_2_IT_1.pdf","05_2_IT_2_0.pdf","05_2_IT_2_1.pdf","05_2_IT_2_2.pdf","05_2_IT_2_3.pdf","05_2_IT_3_0.pdf","05_2_IT_3_1.pdf","05_2_IT_3_2.pdf","05_2_IT_3_3.pdf","05_2_YT_1.pdf","05_2_YT_2.pdf","05_2_YT_3.pdf","05_2_YT_4.pdf","05_2_YT_5.pdf"],["06_0_HN_1.pdf","06_0_HN_2.pdf","06_0_HN_3.pdf","06_1_CJ_1.pdf","06_1_CJ_2.pdf","06_1_CK_1.pdf","06_1_CK_2_1.pdf","06_1_CK_2_2.pdf","06_1_CK_3_1.pdf","06_1_CK_3_2.pdf","06_1_CK_3_3.pdf","06_1_CK_4_1.pdf","06_1_CK_4_2.pdf","06_1_YT_a.pdf","06_1_YT_b.pdf","06_1_YT_c.pdf","06_1_YT_d.pdf","06_2_CJ.pdf","06_2_CK_1_1.pdf","06_2_CK_1_2.pdf","06_2_CK_2.pdf","06_2_CK_3.pdf","06_2_IT_1_0_0.pdf","06_2_IT_1_0_1.pdf","06_2_IT_1_0_2.pdf","06_2_IT_1_1.pdf","06_2_IT_1_2.pdf","06_2_IT_1_3.pdf","06_2_YT.pdf"],["07_0_HN_1.pdf","07_0_HN_2.pdf","07_0_HN_3.pdf","07_1_B_1_R3_0.pdf","07_1_B_1_R3_1.pdf","07_1_B_1_R3_2.pdf","07_1_B_1_R3_3.pdf","07_1_B_1_R3_4.pdf","07_1_B_1_R3_5.pdf","07_1_B_1_R3_6.pdf","07_1_CJ_1.pdf","07_1_CJ_2.pdf","07_1_CK_1.pdf","07_1_CK_2_1.pdf","07_1_CK_2_2.pdf","07_1_CK_3.pdf","07_1_CK_4_1.pdf","07_1_CK_4_2.pdf","07_1_IT_2_0_1.pdf","07_1_IT_2_0_2.pdf","07_1_IT_2_1.pdf","07_1_IT_2_2.pdf","07_1_IT_2_3.pdf","07_1_IT_2_4.pdf","07_1_IT_2_5.pdf","07_1_IT_3_0.pdf","07_1_IT_3_1.pdf","07_1_IT_3_2.pdf","07_1_IT_3_3.pdf","07_1_IT_4_0.pdf","07_1_IT_4_1.pdf","07_1_IT_4_2.pdf","07_1_IT_4_3.pdf","07_1_YT_1.pdf","07_1_YT_2.pdf","07_1_YT_3.pdf","07_1_YT_4.pdf","07_2_B_3_0.pdf","07_2_B_3_1.pdf","07_2_B_3_2.pdf","07_2_B_3_3.pdf","07_2_B_3_4.pdf","07_2_B_3_5.pdf","07_2_B_3_6.pdf","07_2_CJ.pdf","07_2_CK_1_1.pdf","07_2_CK_1_2.pdf","07_2_CK_2_1.pdf","07_2_CK_2_2.pdf","07_2_CK_3-1_1.pdf","07_2_CK_3-1_2.pdf","07_2_CK_3-2_1.pdf","07_2_CK_3-2_2.pdf","07_2_IT_1_0.pdf","07_2_IT_1_1.pdf","07_2_IT_1_2.pdf","07_2_IT_1_3.pdf","07_2_IT_1_4.pdf","07_2_IT_2_0.pdf","07_2_IT_2_1.pdf","07_2_IT_2_2.pdf","07_2_IT_2_3.pdf","07_2_IT_2_4.pdf","07_2_IT_3-1_0.pdf","07_2_IT_3-1_1.pdf","07_2_IT_3-1_2.pdf","07_2_IT_3-1_3.pdf","07_2_YT_1.pdf"],["08_0_HN_1.pdf","08_0_HN_2.pdf","08_0_HN_3.pdf","08_1_B_1_R1_1.pdf","08_1_B_1_R1_2.pdf","08_1_B_1_R2_1.pdf","08_1_B_1_R2_2.pdf","08_1_B_1_R3_1.pdf","08_1_B_1_R3_2.pdf","08_1_B_2_0_1.pdf","08_1_B_2_0_2.pdf","08_1_B_3_R1_1.pdf","08_1_B_3_R1_2.pdf","08_1_B_3_R2_1.pdf","08_1_B_3_R2_2.pdf","08_1_B_3_R3_1.pdf","08_1_B_3_R3_2.pdf","08_1_CJ.pdf","08_1_CK_1_1.pdf","08_1_CK_1_2.pdf","08_1_CK_1_3.pdf","08_1_CK_2_1.pdf","08_1_CK_2_2.pdf","08_1_CK_3_1.pdf","08_1_CK_3_2.pdf","08_1_IT_1_0.pdf","08_1_IT_1_1.pdf","08_1_IT_1_2.pdf","08_1_IT_1_3.pdf","08_1_IT_1_4.pdf","08_1_IT_2_0.pdf","08_1_IT_2_1.pdf","08_1_IT_2_2.pdf","08_1_IT_2_3.pdf","08_1_IT_3_0.pdf","08_1_IT_3_1.pdf","08_1_IT_3_2.pdf","08_1_IT_3_3.pdf","08_1_IT_3_4.pdf","08_1_YT_1_a.pdf","08_1_YT_1_b.pdf","08_1_YT_1_c.pdf","08_1_YT_1_d.pdf","08_1_YT_2_1.pdf","08_1_YT_2_2.pdf","08_1_YT_2_3.pdf","08_2_B_1_1.pdf","08_2_B_1_2.pdf","08_2_B_2_1.pdf","08_2_B_2_2.pdf","08_2_B_3_0.pdf","08_2_B_3_1.pdf","08_2_B_3_2.pdf","08_2_B_3_3.pdf","08_2_B_3_4.pdf","08_2_B_3_5.pdf","08_2_B_4_0.pdf","08_2_B_4_1.pdf","08_2_B_4_2.pdf","08_2_B_4_3.pdf","08_2_B_4_4.pdf","08_2_B_4_5.pdf","08_2_CJ_1.pdf","08_2_CJ_2.pdf","08_2_CK_1.pdf","08_2_CK_2.pdf","08_2_CK_3.pdf","08_2_CK_4.pdf","08_2_IT_3_0_1.pdf","08_2_IT_3_0_2.pdf","08_2_IT_3_1_1.pdf","08_2_IT_3_1_2.pdf","08_2_IT_3_2_1.pdf","08_2_IT_3_2_2.pdf","08_2_IT_3_3_1.pdf","08_2_IT_3_3_2.pdf","08_2_IT_3_4_1.pdf","08_2_IT_3_4_2.pdf","08_2_IT_4_0.pdf","08_2_IT_4_1.pdf","08_2_IT_4_2.pdf","08_2_IT_4_3.pdf","08_2_IT_4_4.pdf","08_2_IT_12_1.pdf","08_2_IT_12_2.pdf","08_2_YT_1.pdf","08_2_YT_2_a.pdf","08_2_YT_2_b.pdf","08_2_YT_2_c.pdf"],["09_0_HN_1.pdf","09_0_HN_2.pdf","09_0_HN_3.pdf","09_1_CJ.pdf","09_1_CK_1_1.pdf","09_1_CK_1_2.pdf","09_1_CK_2_1.pdf","09_1_CK_2_2.pdf","09_1_CK_3-1_1.pdf","09_1_CK_3-1_2.pdf","09_1_CK_3-2.pdf","09_1_CK_4.pdf","09_1_IT_3-2_0.pdf","09_1_IT_3-2_1.pdf","09_1_IT_3-2_2.pdf","09_1_IT_3-2_3.pdf","09_1_IT_3-2_4.pdf","09_1_IT_4_0.pdf","09_1_IT_4_1.pdf","09_1_IT_4_2.pdf","09_1_IT_4_3.pdf","09_1_IT_4_4.pdf","09_1_YT_a.pdf","09_1_YT_b.pdf","09_1_YT_c.pdf","09_1_YT_d.pdf","09_1_YT_e.pdf","09_1_YT_f.pdf","09_2_B_1_R2_0.pdf","09_2_B_1_R2_1.pdf","09_2_B_1_R2_2.pdf","09_2_B_1_R2_3.pdf","09_2_B_1_R2_4.pdf","09_2_B_1_R2_5.pdf","09_2_B_1_R2_6.pdf","09_2_B_2_0.pdf","09_2_B_2_1.pdf","09_2_B_2_2.pdf","09_2_B_2_3.pdf","09_2_B_2_4.pdf","09_2_B_2_5.pdf","09_2_B_2_6.pdf","09_2_CJ_1.pdf","09_2_CJ_2.pdf","09_2_CJ_3.pdf","09_2_CK_1.pdf","09_2_CK_2.pdf","09_2_CK_3.pdf","09_2_CK_4.pdf","09_2_CK_5.pdf","09_2_CK_6.pdf","09_2_IT_1.pdf","09_2_IT_2_0.pdf","09_2_IT_2_1.pdf","09_2_IT_2_2.pdf","09_2_IT_2_3.pdf","09_2_IT_2_4.pdf","09_2_IT_3.pdf","09_2_IT_6_0.pdf","09_2_IT_6_1.pdf","09_2_IT_6_2.pdf","09_2_IT_6_3.pdf","09_2_IT_6_4.pdf","09_2_IT_45_0.pdf","09_2_IT_45_1.pdf","09_2_IT_45_2.pdf","09_2_IT_45_3.pdf","09_2_YT.pdf"],["10_0_HN_1.pdf","10_0_HN_2.pdf","10_0_HN_3.pdf","10_1_B_1_R2_0.pdf","10_1_B_1_R2_1.pdf","10_1_B_1_R2_2.pdf","10_1_B_1_R2_3.pdf","10_1_B_1_R2_4.pdf","10_1_B_1_R2_5.pdf","10_1_B_1_R2_6.pdf","10_1_B_1_R2_7.pdf","10_1_B_1_R2_8.pdf","10_1_B_1_R2_9.pdf","10_1_B_1_R3_0.pdf","10_1_B_1_R3_1.pdf","10_1_B_1_R3_2.pdf","10_1_B_1_R3_3.pdf","10_1_B_1_R3_4.pdf","10_1_B_1_R3_5.pdf","10_1_B_1_R3_6.pdf","10_1_CJ_1.pdf","10_1_CJ_2.pdf","10_1_CK_1-1.pdf","10_1_CK_1-2_1.pdf","10_1_CK_1-2_2.pdf","10_1_CK_2-1_1.pdf","10_1_CK_2-1_2.pdf","10_1_CK_2-1_3.pdf","10_1_CK_2-2_1.pdf","10_1_CK_2-2_2.pdf","10_1_CK_3-1_1.pdf","10_1_CK_3-1_2.pdf","10_1_CK_3-2.pdf","10_1_IT_1-1_0.pdf","10_1_IT_1-1_1.pdf","10_1_IT_1-1_2.pdf","10_1_IT_1-1_3.pdf","10_1_IT_1-2_0.pdf","10_1_IT_1-2_1.pdf","10_1_IT_1-2_2.pdf","10_1_IT_1-2_3.pdf","10_1_IT_1-2_4.pdf","10_1_IT_2-1.pdf","10_1_IT_2-2_0.pdf","10_1_IT_2-2_1.pdf","10_1_IT_2-2_2.pdf","10_1_IT_2-2_3.pdf","10_1_IT_3-1_0.pdf","10_1_IT_3-1_1.pdf","10_1_IT_3-1_2.pdf","10_1_IT_3-1_3.pdf","10_1_IT_3-2_0.pdf","10_1_IT_3-2_1.pdf","10_1_IT_3-2_2.pdf","10_1_IT_3-2_3.pdf","10_1_IT_3-2_4.pdf","10_1_YT.pdf","10_2_B_1_R1_0.pdf","10_2_B_1_R1_1.pdf","10_2_B_1_R1_2.pdf","10_2_B_1_R1_3.pdf","10_2_B_1_R1_4.pdf","10_2_B_1_R2_0.pdf","10_2_B_1_R2_1.pdf","10_2_B_1_R2_2.pdf","10_2_B_1_R2_3.pdf","10_2_B_1_R2_4.pdf","10_2_B_1_R3_0.pdf","10_2_B_1_R3_1.pdf","10_2_B_1_R3_2.pdf","10_2_B_1_R3_3.pdf","10_2_B_1_R3_4.pdf","10_2_B_2_0.pdf","10_2_B_2_1.pdf","10_2_B_2_2.pdf","10_2_B_2_3.pdf","10_2_B_2_4.pdf","10_2_B_3_0.pdf","10_2_B_3_1.pdf","10_2_B_3_2.pdf","10_2_B_3_3.pdf","10_2_B_3_4.pdf","10_2_B_5_R1_0.pdf","10_2_B_5_R1_1.pdf","10_2_B_5_R1_2.pdf","10_2_B_5_R1_3.pdf","10_2_B_5_R1_4.pdf","10_2_B_5_R2_0.pdf","10_2_B_5_R2_1.pdf","10_2_B_5_R2_2.pdf","10_2_B_5_R2_3.pdf","10_2_B_5_R2_4.pdf","10_2_CJ_1.pdf","10_2_CJ_2.pdf","10_2_CK_1.pdf","10_2_CK_2.pdf","10_2_CK_3_1.pdf","10_2_CK_3_2.pdf","10_2_CK_4.pdf","10_2_CK_5.pdf","10_2_CK_6.pdf","10_2_IT_1_0.pdf","10_2_IT_1_1.pdf","10_2_IT_1_2.pdf","10_2_IT_1_3.pdf","10_2_IT_1_4.pdf","10_2_IT_4.pdf","10_2_IT_23_0.pdf","10_2_IT_23_1.pdf","10_2_IT_23_2.pdf","10_2_IT_23_3.pdf","10_2_IT_56_0.pdf","10_2_IT_56_1.pdf","10_2_IT_56_2.pdf","10_2_IT_56_3.pdf","10_2_YT_1.pdf","10_2_YT_2.pdf","10_2_YT_a.pdf","10_2_YT_b.pdf","10_2_YT_c.pdf","10_2_YT_d.pdf","10_2_YT_e.pdf"],["11_0_HN_1.pdf","11_0_HN_2.pdf","11_0_HN_3.pdf","11_1_B_2_R2_0_1.pdf","11_1_B_2_R2_0_2.pdf","11_1_B_2_R2_1.pdf","11_1_B_2_R2_2.pdf","11_1_B_2_R2_3.pdf","11_1_B_2_R2_4.pdf","11_1_B_2_R2_5.pdf","11_1_B_2_R2_6.pdf","11_1_CJ_1.pdf","11_1_CJ_2.pdf","11_1_CJ_3.pdf","11_1_CK_1_1.pdf","11_1_CK_1_2.pdf","11_1_CK_1_3.pdf","11_1_CK_2.pdf","11_1_CK_3_1.pdf","11_1_CK_3_2.pdf","11_1_IT_1_0_1.pdf","11_1_IT_1_0_2.pdf","11_1_IT_1_1.pdf","11_1_IT_1_2.pdf","11_1_IT_1_3.pdf","11_1_IT_1_4.pdf","11_1_IT_1_5.pdf","11_2_B_4_0.pdf","11_2_B_4_1.pdf","11_2_B_4_2.pdf","11_2_B_4_3.pdf","11_2_B_4_4.pdf","11_2_CJ_1.pdf","11_2_CJ_2.pdf","11_2_CK_1_1.pdf","11_2_CK_1_2.pdf","11_2_CK_2.pdf","11_2_CK_3.pdf","11_2_CK_4_1.pdf","11_2_CK_4_2.pdf","11_2_IT_4.pdf","11_2_IT_23_0_1.pdf","11_2_IT_23_0_2.pdf","11_2_IT_23_1.pdf","11_2_IT_23_2.pdf","11_2_IT_23_3.pdf","11_2_IT_23_4.pdf","11_2_IT_23_5.pdf","11_2_IT_23_6.pdf","11_2_IT_23_7.pdf","11_2_YT_a.pdf","11_2_YT_b.pdf","11_2_YT_c.pdf"],["12_0_HN_1.pdf","12_0_HN_2.pdf","12_0_HN_3.pdf","12_1_B_1_0.pdf","12_1_B_1_1.pdf","12_1_B_1_2.pdf","12_1_B_1_3.pdf","12_1_B_1_4.pdf","12_1_B_2_0.pdf","12_1_B_2_1.pdf","12_1_B_2_2.pdf","12_1_B_2_3.pdf","12_1_B_2_4.pdf","12_1_B_6_0_1.pdf","12_1_B_6_0_2.pdf","12_1_B_6_1.pdf","12_1_B_6_2.pdf","12_1_B_6_3.pdf","12_1_B_6_4.pdf","12_1_B_6_5.pdf","12_1_B_6_6.pdf","12_1_B_6_7.pdf","12_1_CJ_1.pdf","12_1_CJ_2.pdf","12_1_CK_1_1.pdf","12_1_CK_1_2.pdf","12_1_CK_1_3.pdf","12_1_CK_2.pdf","12_1_CK_3.pdf","12_1_CK_4_1.pdf","12_1_CK_4_2.pdf","12_1_CK_5.pdf","12_1_CK_6.pdf","12_1_IT_4_0.pdf","12_1_IT_4_1.pdf","12_1_IT_4_2.pdf","12_1_IT_4_3.pdf","12_1_IT_5_0.pdf","12_1_IT_5_1.pdf","12_1_IT_5_2.pdf","12_1_IT_5_3.pdf","12_1_IT_6.pdf","12_1_IT_123_0_1.pdf","12_1_IT_123_0_2.pdf","12_1_IT_123_1.pdf","12_1_IT_123_2.pdf","12_1_IT_123_3.pdf","12_1_YT_a.pdf","12_1_YT_b.pdf","12_1_YT_c.pdf","12_2_CJ.pdf","12_2_CK_1.pdf","12_2_CK_2.pdf","12_2_CK_3.pdf","12_2_CK_4.pdf","12_2_CK_5_1.pdf","12_2_CK_5_2.pdf","12_2_IT_1.pdf","12_2_IT_4_0.pdf","12_2_IT_4_1.pdf","12_2_IT_4_2.pdf","12_2_IT_4_3.pdf","12_2_IT_4_4.pdf","12_2_IT_4_5.pdf","12_2_YT_1_a.pdf","12_2_YT_1_b.pdf","12_2_YT_1_c.pdf","12_2_YT_2_a.pdf","12_2_YT_2_b.pdf","12_2_YT_2_c.pdf"],["13_0_HN_1.pdf","13_0_HN_2.pdf","13_0_HN_3.pdf","13_1_B_1_R2_0.pdf","13_1_B_1_R2_1.pdf","13_1_B_1_R2_2.pdf","13_1_B_1_R2_3.pdf","13_1_B_1_R2_4.pdf","13_1_B_1_R3_0.pdf","13_1_B_1_R3_1.pdf","13_1_B_1_R3_2.pdf","13_1_B_1_R3_3.pdf","13_1_B_1_R3_4.pdf","13_1_B_1_R4_0.pdf","13_1_B_1_R4_1.pdf","13_1_B_1_R4_2.pdf","13_1_B_1_R4_3.pdf","13_1_B_1_R5_0.pdf","13_1_B_1_R5_1.pdf","13_1_B_1_R5_2.pdf","13_1_CJ.pdf","13_1_CK_1_1.pdf","13_1_CK_1_2.pdf","13_1_CK_1_3.pdf","13_1_CK_2_1.pdf","13_1_CK_2_2.pdf","13_1_CK_3_1.pdf","13_1_CK_3_2.pdf","13_1_IT_1_0.pdf","13_1_IT_1_1.pdf","13_1_IT_1_2.pdf","13_1_IT_1_3.pdf","13_1_IT_1_4.pdf","13_1_IT_2_0.pdf","13_1_IT_2_1.pdf","13_1_IT_2_2.pdf","13_1_IT_2_3.pdf","13_1_IT_2_4.pdf","13_1_IT_3_0.pdf","13_1_IT_3_1.pdf","13_1_IT_3_2.pdf","13_1_IT_3_3.pdf","13_1_YT_a.pdf","13_1_YT_b.pdf","13_1_YT_c.pdf","13_1_YT_d.pdf","13_1_YT_e.pdf","13_1_YT_f.pdf","13_2_B_2_R2_0.pdf","13_2_B_2_R2_1.pdf","13_2_B_2_R2_2.pdf","13_2_B_2_R2_3.pdf","13_2_B_2_R2_4.pdf","13_2_B_2_R2_5.pdf","13_2_B_2_R2_6.pdf","13_2_B_3_R1_0.pdf","13_2_B_3_R1_1.pdf","13_2_B_3_R1_2.pdf","13_2_B_3_R1_3.pdf","13_2_B_3_R1_4.pdf","13_2_B_3_R1_5.pdf","13_2_B_3_R1_6.pdf","13_2_B_3_R2_0.pdf","13_2_B_3_R2_1.pdf","13_2_B_3_R2_2.pdf","13_2_B_3_R2_3.pdf","13_2_B_3_R2_4.pdf","13_2_B_3_R2_5.pdf","13_2_B_3_R2_6.pdf","13_2_CJ.pdf","13_2_CK_1_1.pdf","13_2_CK_1_2.pdf","13_2_CK_2_1.pdf","13_2_CK_2_2.pdf","13_2_CK_3_1.pdf","13_2_CK_3_2.pdf","13_2_IT_1_0.pdf","13_2_IT_1_1.pdf","13_2_IT_1_2.pdf","13_2_IT_1_3.pdf","13_2_IT_1_4.pdf","13_2_IT_3.pdf"],["14_0_HN_1.pdf","14_0_HN_2.pdf","14_0_HN_3.pdf","14_1_B_4_0.pdf","14_1_B_4_1.pdf","14_1_B_4_2.pdf","14_1_B_4_3.pdf","14_1_B_4_4.pdf","14_1_CJ.pdf","14_1_CK_1_1.pdf","14_1_CK_1_2.pdf","14_1_CK_2.pdf","14_1_CK_3.pdf","14_1_CK_4-1_1.pdf","14_1_CK_4-1_2.pdf","14_1_CK_4-2_1.pdf","14_1_CK_4-2_2.pdf","14_1_IT_3_0.pdf","14_1_IT_3_1.pdf","14_1_IT_3_2.pdf","14_1_IT_12_0.pdf","14_1_IT_12_1.pdf","14_1_IT_12_2.pdf","14_1_IT_12_3.pdf","14_2_CJ_1.pdf","14_2_CJ_2.pdf","14_2_CK_1.pdf","14_2_CK_2.pdf","14_2_CK_3.pdf","14_2_CK_4_1.pdf","14_2_CK_4_2.pdf","14_2_IT_3_0.pdf","14_2_IT_3_1.pdf","14_2_IT_3_2.pdf","14_2_IT_3_3.pdf","14_2_IT_3_4.pdf","14_2_IT_4_0.pdf","14_2_IT_4_1.pdf","14_2_IT_4_2.pdf","14_2_IT_4_3.pdf","14_2_YT_a.pdf","14_2_YT_b.pdf","14_2_YT_c.pdf","14_2_YT_d.pdf","14_2_YT_e.pdf","14_2_YT_f.pdf"],["15_0_HN_1.pdf","15_0_HN_2.pdf","15_0_HN_3.pdf","15_1_CJ.pdf","15_1_CK_1_1.pdf","15_1_CK_1_2.pdf","15_1_CK_2.pdf","15_1_CK_3.pdf","15_1_CK_4_1.pdf","15_1_CK_4_2.pdf","15_1_IT_12_0.pdf","15_1_IT_12_1.pdf","15_1_IT_12_2.pdf","15_1_IT_12_3.pdf","15_1_IT_12_4.pdf","15_1_YT_a.pdf","15_1_YT_b.pdf","15_1_YT_c.pdf","15_2_B_1_0.pdf","15_2_B_1_1.pdf","15_2_B_1_2.pdf","15_2_B_1_3.pdf","15_2_B_3_0_1.pdf","15_2_B_3_0_2.pdf","15_2_B_3_1.pdf","15_2_B_3_2.pdf","15_2_B_3_3.pdf","15_2_CJ.pdf","15_2_CK_1_1.pdf","15_2_CK_1_2.pdf","15_2_CK_2.pdf","15_2_CK_3_1.pdf","15_2_CK_3_2.pdf","15_2_IT_3_0.pdf","15_2_IT_3_1.pdf","15_2_IT_3_2.pdf","15_2_IT_3_3.pdf","15_2_IT_12_0.pdf","15_2_IT_12_1.pdf","15_2_IT_12_2.pdf","15_2_IT_12_3.pdf","15_2_YT_a.pdf","15_2_YT_b.pdf","15_2_YT_c.pdf"]];
  return fileNameLists;
}

これで別ファイル(例えばコード.gs)からgetWinSortFileNames()を書くだけで、ファイル名が呼び出せる。

次に、ドライブに上げた画像ファイルを呼び出す。
「画像ファイルを入れたフォルダのID」の部分は、フォルダ階層がcd1 > image > L01_imgとなっている場合、「image」に当たるフォルダのIDを入れる。
アドレスバーからコピーしたり、リンクの取得を押してコピーしたりしてID部分を切り取る。

data.js
function getDriveFiles(){
  const imageFolders = DriveApp.getFolderById('画像ファイルを入れたフォルダのID').getFolders();
  let imageFolder = [];
  let driveFiles = [];

  while (imageFolders.hasNext()) {
    imageFolder.push(imageFolders.next().getFiles());
  }
  for(let i=0; i < imageFolder.length; i++){
    driveFiles[i] = [];
    while(imageFolder[i].hasNext()){
      driveFiles[i].push(imageFolder[i].next());
    }
    driveFiles[i].sort();
  }
  driveFiles.sort();
  return driveFiles;
}

ここではファイル名が連番になっているので、通常のソートを行っても大丈夫。

次にリネームの処理を書く。流れとしては
「pdfのファイル名データ」と「ドライブから変更を加えるファイル」をそれぞれ取得。
両者の数が合っていればその個数分だけのループ回数が設定され、数が合わなければループせず、次に行く。
これはAcrobatで結合・PDF印刷・画像エクスポートした時に、どこかで抜け落ちがあった場合の対策のため。

コード.js

function renameFiles(){
  const winSortFileNames = getWinSortFileNames();
  const driveFiles = getDriveFiles();
  const neededLoopCountsForI = driveFiles.length == winSortFileNames.length ? winSortFileNames.length :0;
  let neededLoopCountsForJ;
  let i;
  let j;
  for(i=0; i<neededLoopCountsForI; i++){
    neededLoopCountsForJ = driveFiles[i].length == winSortFileNames[i].length ? winSortFileNames[i].length :0;
    Logger.log("neededLoopCountsForJ : "+neededLoopCountsForJ);
    Logger.log("driveFiles[i].length : "+driveFiles[i].length+"\n driveFiles[i] : "+driveFiles[i]);
    Logger.log("winSortFileNames[i].length : "+winSortFileNames[i].length+"\n winSortFileNames[i] : "+winSortFileNames[i]);

    for(j=0; j<neededLoopCountsForJ; j++){
        driveFiles[i][j].setName(winSortFileNames[i][j]);
        Logger.log("i: "+i+", j: "+j+", fileName: "+winSortFileNames[i][j]);
    }
  }
}

スコープでエラーが出る場合

通常なら、ポップアップが出てきて権限の許可を求められるが、たまにそれが出ないことがある。私の場合はテストを実行したときに閲覧権限だけに許可してしまい、それっきり、編集しようとしたら権限ありませんと言われ、ポップアップも出てこない状況になった。
その場合は左の「プロジェクトの設定」から全般設定の「「appsscript.json」マニフェスト ファイルをエディタで表示する」のチェックボックスをオンにし、エディタのappsscript.jsonを設定すればOK。この先の作業もあるので、まとめて次のように設定した。

appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "oauthScopes": ["https://www.googleapis.com/auth/drive","https://www.googleapis.com/auth/presentations","https://www.googleapis.com/auth/spreadsheets"],
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

これで実行すると再びポップアップが出てきて、権限許可をたずねてきてくれる。

課の数だけSlideを自動生成

A4で印刷するので、スライドのサイズを210×297mmに合わせる。
ここはドキュメント調べたりしているうちに時間が流れてしまい、手作業でやった方が早かった。
Google SlideをGASで扱う場合、スライドのページサイズを変更することはできない模様。
Stack Overflow - Change page size in google slide with GAS , Oct 23 '19
Stack Overflow - Is there a known way to update the page setup size In the Google Slides API? , Jan 2 '19

そこで、まず1つだけ手作業でテンプレート的なファイルを作る。
次にそのファイルのIDをコピペして、
ドライブで保存したいフォルダを作っておいて、そのIDもコピペした。
今回は15個分作成した。

function copySlideFile(){
  const original = DriveApp.getFileById('スライドテンプレのID');
  for(let i=1;i<15;i++){
    original.makeCopy().moveTo(DriveApp.getFolderById('ドライブのフォルダID')).setName("L"+zeroPadding(i,2));
  }
}//生成されたファイル、2つくらい手で直した。

function zeroPadding(NUM, LEN){
    return ( Array(LEN).join('0') + NUM ).slice( -LEN );
}

スライドにデータを流し込む準備

スプレットシートのレッスンごとの範囲を指定する

スプレットシートをGASから呼ぶとき、課ごとにRangeを分けて二重配列にしたい。
ここは自動振り分けのコード書くのが億劫だったので手作業にした。
CD1

function getDekiruSpreadSheet(lesson){
  const rangeList = ['A2:K20','A21:K84','A85:K160','A161:K245','A246:K315','A316:K398','A399:K471','A472:K549','A550:K598','A599:K652','A653:K728','A729:K804','A805:K877','A878:K917','A918:K977','A978:K1034'];
  const sheet = SpreadsheetApp.openById('1IkEeuA6BbE_uq22QDXG4dHNORriJNvAFmAB_rsf9ZNc').getSheets()[0];
  return sheet.getRange(rangeList[lesson]).getValues();
}

CD2

function getDekiruSpreadSheet(lesson){
  const rangeList = ["A2:J24","A25:J93","A94:J219","A220:J258","A259:J294","A295:J372","A373:J401","A402:J469","A470:J558","A559:J626","A627:J748","A749:J801","A802:J871","A872:J953","A954:J999","A1000:J1043"];
  const sheet = SpreadsheetApp.openById('CD2のスプレットシートのID').getSheets()[0];
  return sheet.getRange(rangeList[lesson]).getValues();
}

ここに同じ関数名で2つのコードを並べたが、CD1のdekiru_guideillとCD2のdekiru2_guideillは別々のGASプロジェクトとしてファイルを作成している(それぞれ別々のスプレットシートからツール > スクリプトエディタを押して、それぞれ別々にコードを書いている)ので関数名は同じになった。

流し込むスライドのファイルの場所を指定する。

自動生成したスライドファイルが並んでいるフォルダの位置をIDで指定し、取得します。

data.js
function getDekiruSlides(){
  const slidesFiles = DriveApp.getFolderById('フォルダのID').getFiles();
  let files = [];
  while(slidesFiles.hasNext()){
    files.push(slidesFiles.next());
  }
  return files.sort();
}

スライドファイルを1つ開いて流し込む

画像データの取得はテストコードを書く時にgetBlob()ではうまくいかず、getThumbnail()ではなぜか成功したので、そのままにしている。サムネイルのはずなのに、それほど小さくも粗くも見えない。
後で試したらgetBlobでもうまくいったので、どっちでもいいっぽい。

function editingSlide(){
const lesson = 0; // select lesson number here!!
const slide = SlidesApp.openById(getDekiruSlides()[lesson].getId());
Logger.log(slide.getName());
const pageWidthHeight = [slide.getPageWidth(), slide.getPageHeight()];
const imageFiles = getDriveFiles()[lesson];
const values = getDekiruSpreadSheet(lesson);
Logger.log(imageFiles);

  let page;  
  let smallFont = 20;
  let largeFont = 40;
  let currentImageFile;
  let hasDot;
  for(let i=0; i<values.length; i++){
    hasDot = values[i][1].slice(-4) == ".pdf";
    Logger.log(values[i][1] + " is values[i][1]");
    Logger.log("\t hasDot : "+hasDot);
    Logger.log("\t "+imageFiles[0].getName().substr(0,imageFiles[0].getName().length-4) + " is imageFiles[0].getName().substr(0,imageFiles[0].getName().length-4)")
    currentImageFile = hasDot ? imageFiles.find((name) => name.getName().substr(0,name.getName().length-4)==values[i][1].slice( 0, -4 ))
                              : imageFiles.find((name) => name.getName().substr(0,name.getName().length-4)==values[i][1].slice( 0, -3 ));
    Logger.log("\t currentImageFile : "+currentImageFile);
    page = slide.insertSlide(slide.getSlides().length).insertTextBox("ファイル名: " + values[i][1],0,0,pageWidthHeight[0],pageWidthHeight[1]).getText();
    page.appendParagraph("\n"+values[i][2]+""+values[i][3]).getRange().getTextStyle().setFontSize(smallFont).setFontFamily('M PLUS Rounded 1c');
    page.appendParagraph(values[i][4]+" " + values[i][5]+" ("+values[i][6]+"").getRange().getTextStyle().setFontSize(largeFont).setFontFamily('M PLUS Rounded 1c');
    page.appendParagraph("\n学習項目:").getRange().getTextStyle().setFontSize(smallFont).setFontFamily('M PLUS Rounded 1c');
    page.appendParagraph(values[i][7]).getRange().getTextStyle().setFontSize(largeFont).setFontFamily('M PLUS Rounded 1c');
    page.appendParagraph("\n話題:").getRange().getTextStyle().setFontSize(smallFont).setFontFamily('M PLUS Rounded 1c');
    page.appendParagraph(values[i][8]).getRange().getTextStyle().setFontSize(largeFont).setFontFamily('M PLUS Rounded 1c');
    page.appendParagraph("\n内容説明:").getRange().getTextStyle().setFontSize(smallFont).setFontFamily('M PLUS Rounded 1c');
    page.appendParagraph(values[i][9]).getRange().getTextStyle().setFontSize(largeFont).setFontFamily('M PLUS Rounded 1c');
    if(typeof values[i][10] !== "undefined"){page.appendParagraph("\n補足:"+ values[i][10]).getRange().getTextStyle().setFontSize(smallFont).setFontFamily('M PLUS Rounded 1c')};    slide.insertSlide(slide.getSlides().length).insertImage(currentImageFile.getThumbnail());
    currentImageFile=null;
  }
}

冒頭のlessonにレッスン番号を入れて1レッスンごとに実行して使う。
元々はレッスン0からレッスン15まで一気にやる予定だったが、エラーとか時間制限とかが怖くなって分けることにした。案の定何度かエラーが出たが、再試行したら何ともなく進んだ。

PDFでダウンロード

自動で画像と説明が交互に追加されたスライドを開き、
ファイル > ダウンロード > PDFドキュメント(.pdf)を押してダウンロード。
手動で30回行った。
これで、両面印刷用のファイル作成作業は終了。

この後は印刷屋さんや業務用プリンター等でプリントアウトして、ラミネート加工をして完成。

作業で見つかったGASで『できる日本語』のイラストデータCD-ROMの問題

以下に、作業が当初予期していたよりも煩雑になった要因を幾つか述べる。

PDFのページの大きさ不揃い問題

おそらく、大きく印刷したり、プロジェクター等で大画面で使用したり、
自作プリントのイラストとして小さく使用したり、といったシーンを想定していると思われる。
しかしながら、今私がやろうとしているのは大きいのも小さいのも全部A4、大量生産、標準化万歳である。
したがって私にとっては大きさ不揃いなのは問題であったが、幸いベクターだったので引き伸ばししても大丈夫だった。

ファイル名に起因するソート問題

先ほど、Acrobatに入れる前に名前順で並べ替えた。
これは「できる日本語のイラストデータCD-ROM」が独特なファイル名命名規則を採用しているため。
たとえば

01_0_HN_2.pdf
05_3_IT_4_4.pdf

のように、_で区切られた数字の数が異なるファイル名が存在していたり、

03_3_IT_23_1.pdf
03_3_IT_23_01.pdf

のように、0があるなしでそれぞれ異なる画像が存在する。さらにCD付属のリストは順番がWindowsのソート順ではない。
このため、本作業ではWindows(筆者の環境)でpdfが表示された順番通りにファイル名をコピーし、jpegをリネームしていく工程が入った。

CD付属のリストのファイル名「.」ついてないのがある問題

もっと悪いことに、付属Excelリストのファイル名カラム、
「01_0_HN_1pdf」の次が
「01_0_HN_2.pdf」その次が
「01_0_HN_3pdf」であった。
「.」(ドット)がついていないのが幾つか存在した。(大部分はドットがついていた)
そして、一件だけ「02_2_IT_2_pdf」と、「.」の代わりに「_」が打たれている行があった。
このため以下のコードが入った。

hasDot = values[i][1].slice(-4) == ".pdf";
hasDot ? ファイル名.slice( 0, -4 )) : ファイル名.slice( 0, -3 ));

しかしこれでは「02_2_IT_2_pdf」はすり抜けていってしまい、エラーになってしまったので、あきらめて手作業で修正を行った。

ポエム:上記の作業をCD買った人全員が楽々できるようにするはずだった

作業を終えて、自分用には一応目的は達成されたものの、もう一つ目指していたものがあった。
他の日本語教師で「できる日本語 イラストデータCD-ROM」を購入した人が、ボタン一つ(あるいは数ステップの簡単な操作)で、今回の作業が行えるようにするつもりだった。

というのも、つい最近、山口県で教員をされているこちらの方が積極的にGASのアプリを作成されていて、教育現場にGASの作成者と利用者が広がっている様子をTwitterで目撃した。以下の投稿と2つの記事が記憶に新しい。

【EXCELからGoogleフォーム】英単語テスト自動作成ファイル
【GAS】Google Classroomクラス一括作成スプレッドシート

この「ニッチなRPA」のオープンソース化の流れに私も乗ろうとしたが、今回はそれが達成できなかった。
大きな障害はPDFを画像にする必要がった点。これは有料のAcrobatならきれいに出来るが、Windowsにインストールして使うフリーソフトでは思うようにいかないことが多いと感じる。かといって、高いお金を出して買った(初級編と初中級編合わせて1万円ほど)コンテンツをウェブ上のPDF-JPG変換ツールにアップロードするのは気持ちが悪い。

という訳でこのようにGASが使える人しか使えない形になってしまった。
残念ではあるが、誰もがボタン1つで~というのは今後の開発で目指していこうと思う。

0
0
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
0