質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

586閲覧

【GAS】xls→スプレッドシート変換時の新ファイル名の生成(ファイル間での処理差分)

donguriko

総合スコア30

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2023/03/25 06:41

編集2023/03/25 06:54

前提

親フォルダ内に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

補足情報

回答は急ぎません。
次回から自分で解決できようになりたいので、
非エンジニアビギナーでも理解できるレベルでの解説、
アドバイスが欲しいです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/03/26 00:57

手元で同じように作っても、同様の状況を再現することができませんでした。変換後フォルダに作成されたいずれのファイルも、正常なファイル名(xlsxがつかないファイル名)で作成されています。 フォルダを変えても、同じような状況が発生しますか?
donguriko

2023/03/26 01:29

qnoirさま お忙しい中、確認ありがとうございました。 アドバイスいただいたとおり、別フォルダでトライしてみたところ、 不具合が解消されました。 お手間を取らせてしまい申し訳ありませんでした。 質問する前に、別フォルダでトライしてみればよかったですね。 下欄の自己解決欄に、別フォルダでトライした結果を掲載させていただきました。 アドバイスありがとうございました。(感謝)
guest

回答1

0

自己解決

qnoirさまのアドバイスどおり、マイドライブ内に別のフォルダを作成し、
実行してみたところ、問題が解消されました。

(参考)
<ログシート転記イメージ>
イメージ説明

<Ss変換済 フォルダイメージ>
イメージ説明

昨日うまくできなかった原因はわからないですが、次回類似のケース
にあたった場合は、まずは上記の方法を試してみます。
お手間とお時間を頂戴してしまい申し訳ありません。
お忙しい中、確認と回答ありがとうございました。

投稿2023/03/26 01:30

donguriko

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問