
前提
親フォルダ内に2つの子フォルダがあります。
a)xls元ファイル フォルダ
b)Ss変換済 フォルダ
また、親フォルダ直下にはスプレッドシートファイルがあります。
スプレッドシートファイルには、
・「はじめに」シート
・変換ログシート があり、下のGAS処理を登録します。
(参考)はじめにシートイメージ
実現したいこと
<処理1>
フォルダa)内に格納されている全ファイルをGASでxls→スプレッドシート
に変換し、変換済のファイルのファイル名を"【変換済】" +「元ファイル名」
にする。
<処理2>
変換済のファイルをフォルダb)に格納する。
<処理3>
変換ログシートに以下を転記する。
・変換後ファイル名
・変換後ファイルのURLリンク
・変換後ファイルのファイルID
・タイムスタンプ
発生している問題
試しに、xlsファイルを3つ用意し、GASを実行しました。
3ファイルのうち、1つのファイルのみファイル名の末尾に拡張子「.xlsx」
がついてしまいます。
<ログシート転記イメージ>
<Ss変換済 フォルダイメージ>
教えてほしい、アドバイスがほしいこと
Q1:なぜ、1ファイルだけ処理が相違してしまうのか
Q2:どのようにコードを修正すれば、ファイル間の相違を
なくせるか (全ファイル拡張子なしを希望)
該当のソースコード
メインプログラム xlsToSs()
部品プログラム writeLog()
それぞれ、下に全部記載します。
GAS
1function xlsToSS() { 2 /* 3 <<処理概要>> 4 「xls元フォルダ」内のxlsファイルをすべてSsに変換 5 ・変換済Ssファイルを「Ss変換済」フォルダに格納 6 ・変換ログシートに処理を実行したファイル名、URLリンク、ファイルID、タイムスタンプを転記 7 ・処理完了Msgを表示 8 */ 9 10 const ss = SpreadsheetApp.getActiveSpreadsheet(); 11 const startSheet = ss.getSheetByName('はじめに'); 12 13 //▼変換処理対象フォルダfromFの指定 14 //フォルダID_FromfIdは「はじめに」シートのセルD5から取得 15 const FromfId = startSheet.getRange(5, 4, 1, 1).getValue(); 16 console.log('FromfId ' + FromfId); 17 18 //▼変換処理済フォルダtoFの指定 19 //フォルダID_TofIdは「はじめに」シートのセルD10から取得 20 const TofId = startSheet.getRange(10, 4, 1, 1).getValue(); 21 console.log('TofId ' + TofId); 22 23 //▼fromF内の全ファイルをxlsFilesとして取得 24 const xlsFiles = DriveApp.getFolderById(FromfId).getFiles(); 25 26 //▼取得したxlsファイルをスプシ変換 27 while (xlsFiles.hasNext()) { 28 const file = xlsFiles.next(); //順番にファイルを処理 29 const xlsFileId = file.getId(); //エクセルのファイルID取得 30 console.log('xlsFileId ', xlsFileId); 31 32 //▼変換後のファイル名の指定 33 const orgfileName = file.getName(); 34 const cv_fileName = "【変換済】" + orgfileName; 35 console.log('orgfileName ' + orgfileName); 36 console.log('cv_fileName ' + cv_fileName); 37 38 //変換時の各種オプションを設定 39 //mimeTypeをスプレッドシートにすることで変換される 40 const filecontent = DriveApp.getFileById(xlsFileId).getBlob(); 41 42 const option = { 43 "mimeType": MimeType.GOOGLE_SHEETS, //ファイルの種類指定 44 "parents": [{ id: TofId }], //格納先の指定 45 "title": cv_fileName //ファイル名の指定 46 }; 47 const cv_Ss = Drive.Files.insert(option, filecontent); 48 } 49 writeLog(); //部品PGM_writeLog()を実行 50} 51 52以下部品PGM ************************************************ 53 54function writeLog() { 55 const ss = SpreadsheetApp.getActiveSpreadsheet(); 56 const logSheet = ss.getSheetByName('変換ログシート'); 57 const startSheet = ss.getSheetByName('はじめに'); 58 const FromfId = startSheet.getRange(5, 4, 1, 1).getValue(); 59 const TofId = startSheet.getRange(10, 4, 1, 1).getValue(); 60 61 //▼前処理:変換ログシートに記録済の内容をリセットクリアする 62 //削除範囲delRangeは、C列:F列 63 //getRange(行目,列目,行分,列分) 64 const delLastRow = logSheet.getLastRow(); 65 console.log('delLastRow ' + delLastRow); //11が正解 66 const delRows = delLastRow - 2; 67 console.log('delRows ' + delRows); //9が正解 68 const delRange = logSheet.getRange(3, 3, delRows, 5).clearContent(); 69 70 //▼Ss変換済フォルダ内のファイルを配列arrConvFilesとして一括取得 71 const convFs = DriveApp.getFolderById(TofId).getFiles(); 72 let arrConvFiles = []; //配列の宣言 73 while (convFs.hasNext()) { 74 const convF = convFs.next(); 75 const name = convF.getName(); //ファイル名取得 76 const Url = convF.getUrl(); //ファイルのURLを取得 77 const Id = convF.getId(); //ファイルID取得 78 79 arrConvFiles.push([name, Url, Id]); //配列arrConvFilesにname,Url,Idを格納 80 console.log("arrConvFiles ", arrConvFiles); 81 82 //▼配列arrConvFilesの内容をログシート セルC3以降に書出し 83 //getRange(行目、列目,▲行分,●列分) 84 //▲:配列arrConvFilesの長さ分 85 //●:配列arrConvFilesの行インデックス[0]の要素数分 86 console.log("arrConvFiles.length " + arrConvFiles.length); 87 logSheet.getRange(3, 3, arrConvFiles.length, arrConvFiles[0].length).setValues(arrConvFiles); 88 89 //ログシート セルF3以降にタイムスタンプ追記 90 //getRange(行目、列目,▲行分,●列分) 91 const timeStamp = new Date(); 92 console.log(timeStamp); 93 logSheet.getRange(3, 6, arrConvFiles.length, 1).setValue(timeStamp); 94 } 95 //変換処理終了のポップアップMsg表示 96 //flushで処理を強制実行 97 SpreadsheetApp.flush(); 98 Browser.msgBox("スプレッドシートへの変換処理が完了しました。\\nログシートに変換処理のログを記録しました。", Browser.Buttons.OK); 99} 100 101
補足情報
回答は急ぎません。
次回から自分で解決できようになりたいので、
非エンジニアビギナーでも理解できるレベルでの解説、
アドバイスが欲しいです。
よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー