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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

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

Q&A

解決済

1回答

3084閲覧

GASでExcelのデータ表からSQLのINSERT文を自動生成したいです

heysuky

総合スコア21

Google Apps Script

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

0グッド

1クリップ

投稿2020/07/20 01:12

編集2020/07/20 01:13

前提・実現したいこと

タイトル通りです。

発生している問題・エラーメッセージ

困っているのは、INSERT文を生成する時に、文字列であれば''をつけ、そうでなければ''をつけないという様にif文で条件分岐させたのですが、日付だけ文字列として認識されず''がつかずにINSERT文が生成されてしまうというものです。日付にも''をつけたいのですが、数値や文字列かどうか確かめるためのisNaNなどの関数を見つけられなかったのでどうしたらいいか詰まっています。
宜しくお願いいたします。

該当のソースコード

GAS

1function addInsert() { 2 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 3 var sheet1 = spreadsheet.getSheetByName("シート1"); 4 var lastColumn = sheet1.getLastColumn(); 5 var lastRow = sheet1.getLastRow(); 6 7 // INSERT文のカラムを入れるところまで書く 8 var sentence = 'INSERT INTO ' + sheet1.getRange(1,2).getValue() + '('; 9 // スプレッドシートの2行目にカラムが入っているのでそれを取り出す 10 for (var i = 1;i <= lastColumn;i++) { 11 if(i != lastColumn) { 12 sentence += sheet1.getRange(2,i).getValue() + ','; 13 } else { 14 sentence += sheet1.getRange(2,lastColumn).getValue() + ')'; 15 } 16 } 17 18 // VALUESのあとの文を追加する 19 sentence += ' VALUES'; 20 // 3行目からデータが記述されているのでそれらを行ごとに、最後の列まで取り出す 21 for (var i = 3;i <= lastRow;i++) { 22 for (var j = 1;j <= lastColumn;j++) { 23 if(sheet1.getRange(i,1).getValue() == '') break; 24 // 数値ではなかった場合にシングルクォーテーションで文字をくくるようにする 25 if (j == 1) { 26 sentence += '('; 27 } 28 29 // 最後のカラムではない場合 30 if (j != lastColumn) { 31 if (!isNaN(sheet1.getRange(i,j).getValue())) { 32 sentence += sheet1.getRange(i,j).getValue() + ','; 33 } else { 34 sentence += "'" + sheet1.getRange(i,j).getValue() + "',"; 35 } 36 //最後のカラムかつ最後の行、つまり最後のセルである場合。 )で閉じる必要がある 37 } else if (j == lastColumn && i == lastRow) { 38 if (!isNaN(sheet1.getRange(i,j).getValue())) { 39 sentence += sheet1.getRange(i,j).getValue() + ')'; 40 } else { 41 sentence += "'" + sheet1.getRange(i,j).getValue() + "')"; 42 } 43 // 最後のカラムである場合 ),で閉じてピリオドを入れる必要がある 44 } else if (j == lastColumn) { 45 if (!isNaN(sheet1.getRange(i,j).getValue())) { 46 sentence += sheet1.getRange(i,j).getValue() + '),'; 47 } else { 48 sentence += "'" + sheet1.getRange(i,j).getValue() + "'),"; 49 } 50 } 51 } 52 } 53} 54

以下が実際に生成されたSQL文です

SQL

1INSERT INTO facility(id,name,type_id,capacity,insert_date,update_date,user_id) VALUES(1,'会議室001',1,816,Sat Jan 01 2000 00:00:00 GMT+0900 (日本標準時),Tue Jan 01 2002 00:00:00 GMT+0900 (日本標準時),'A0001'),(2,'会議室002',1,506,Sun Jan 02 2000 00:00:00 GMT+0900 (日本標準時),Wed Jan 02 2002 00:00:00 GMT+0900 (日本標準時),'A0002'),(3,'会議室003',1,450,Mon Jan 03 2000 00:00:00 GMT+0900 (日本標準時),Thu Jan 03 2002 00:00:00 GMT+0900 (日本標準時),'A0003')

スプレッドシートはこんな感じです。

テーブル名 facility
id name type_id capacity insert_date update_date user_id
1 会議室001 1 816 2000/1/1 0:00 2002/1/1 0:00 A0001
2 会議室002 1 506 2000/1/2 0:00 2002/1/2 0:00 A0002
3 会議室003 1 450 2000/1/3 0:00 2002/1/3 0:00 A0003

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

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

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

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

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

guest

回答1

0

ベストアンサー

isNaNではなく、typeofinstanceof使って判定すればいいです。

JavaScript

1if(typeof sheet1.getRange(i,j).getValue() === "string") { 2 //文字列 3} 4else if(typeof sheet1.getRange(i,j).getValue() === "number") { 5 //数値 6} 7else if(sheet1.getRange(i,j).getValue() instanceof Date) { 8 //日時 9}

投稿2020/07/20 04:20

draq

総合スコア2577

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

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

heysuky

2020/07/21 01:09

回答ありがとうございます。 試したのですが、console.logで日付の入っているセルの型を調べたところ、objectと出ていたのでそれだとうまくいきませんでした。 何か解決方法ありますでしょうか?
draq

2020/07/21 02:16

typeof だけで調べてませんか?Date型はtypeofではobjectを返すので、instanceof 使って調べてください。
heysuky

2020/07/21 02:23 編集

すみません、返信きてたことに気づかず送ってしまってました。 何かを見落としていたのか、instanceof Dateでやってみたらうまくいきました。 自分のコードよりわかりやすくて助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問