macoblog

「ゲーム × プログラミング」で生きていく

アプリ検索ツール(β版)を公開

スプレッドシートで分数が日付に置き換わる時の解決策+おまけ(GAS)

プログラミング

WEBトマトこと筆者
「まずツムツムアイコンですまん。今回はスプレッドシートでの分数の扱い方について解説しておきます、というのもデータ取り込みやGASを交えた時の挙動でハマりかけた筆者の苦い経験からシェアしておいた方がいいのではないかなって話に繋がる」

スプレッドシート利用者の方で下記の問題に直面している方におすすめの記事です。

  1. 分数を入力すると値が勝手に日付に置き換わる ←「これをやめさせたい」
  2. IMPORTしてきた分数の値が日付になる ←「これをやめさせたい」

前者はサクッと解決可能です、後者は結構大変で記事にしておこうと思ったのはまさにこの部分でハマりかけたから、レアケースだとは思いますが今回はここを深掘りしていく形です。

目次【本記事の内容】

分数が勝手に日付に置き換わるのを止める方法

まず最初に「入力した値が勝手に日付に置き換わる」これがどういうことかスクショで説明しておきますね、下記の通りです。

その①:セルに値を入力する

その①:セルに値を入力する(分数や日付)
セルに分数や日付を入力します、ここでは「1/10」としておきます。

その②:自動で日付に置き換わってしまう

その②:自動で日付に置き換わってしまう
すると、自動で値が日付に置き換えられてしまい、期待したデータの持ち方としては全然違いますよね、これをやめさせようというのがここでの解説内容になります。

表示形式を変えれば解決

自分でセルに入力した値であればこれは簡単に解決できます、入力する前に表示形式を変えてあげればOKです。

  1. 対象のセル(範囲)を選択し「表示形式」をクリック
  2. 「数字」>「書式なしテキスト」にする(※)

上記の手順を踏んだあともう一度セルに入力してみましょう、勝手に日付に置き換わらなくなっているはずです、万事解決!!

2の補足(※)

対象のセル(範囲)を選択し「表示形式」をクリック、「数字」の項目から「書式なしテキスト」をクリックし設定する

抽出したデータの場合は無理だった→解決策の提案

ここからが本題、抽出したデータの場合は先ほどの方法では解決できない場合があります、ここでいう「抽出したデータ」とは[IMPORT関数]を使って取りん込んだデータを意味します、この場合だと表示形式を変えても期待した結果を返してくれない場合があります、、、まじでハマる、、、。

実際に見た方が早いですよね、下記の確率表を[IMPORTHTML]を使って抽出してみると分かりやすい(サイコロの出目パターンを分数で確率表示している表になります)

パターン 確率
2回連続同じ目が出る確率 1/36
3回連続同じ目が出る確率 1/216
4回連続同じ目が出る確率 1/1296

スプレッドシート内に下記をコピペして動かしてみて下さい、セルの値が日付(本来は分数で表示したい)になっていると思うので表示形式を「書式なしテキスト」にしてみましょう、すると、小数で表示されて余計におかしくなりませんか。

=IMPORTHTML("https://macoblog.com/spreadsheets-bunsuu-hiduke/","table")

抽出したデータを書式なしテキストに設定するとおかしくなる

私の場合、抽出したデータをGASを使って別シートに書き出したかったわけで、値が日付になっている状態でGASでデータを取得すると書き出した時に日付で表示されるので、データの持ち方としてちゃんちゃらおかしい、つまり困るんです。

んじゃどうすんのって話

これを解決する策は私のググる力では見つけることができませんでした、なので表示形式などからの解決は諦めて、GASで取得したタイミングで「日付から文字列」に加工してしまおうという路線に切り替えました。

つまりこういうこと(下記)

  1. IMPORT関数でデータを抽出 → 日付がおかしい
  2. GASでセルの値を取得 → 日付で取得される
  3. GASで日付を加工する → 日付を文字列に加工
  4. 書き出し先シートの表示形式を「書式なしテキスト」にしておく
  5. 加工したデータをシートに書き出す

ちょっとややこしいかもしれませんがもっと簡単に説明すると、、、

  1. 「データを抽出」← この時点でおかしい
  2. 「GASでセルのデータを取得」← おかしいまま
  3. 「GASで値を加工」← ここで変えてあげる
  4. 「データをシートに書き出す」← 正しい値になってる

これについて深掘りしていきますので環境に合わせてご参考ください、これから解説するものは「かなり冗長なコード」であることを先に謝っておきます、ごめんなさいm(_ _)m

ステップ①:GASでセルのデータを取り込む

A1の値をGASを使ってA2に最適化した値を書き出してみる
上記は見ての通り分数値が日付に置き換わっている、これをGASを使って最適化したものを下のセル(A2)に書き出してみる。

抽出したデータと仮定しA1セルに「1/1000」と入力してスクリプトエディタを立ち上げてください、GASの基礎的な説明はここでは割愛させていただきます。

下記コードでシートを取得、取得したシートからセルを範囲指定してデータを取りだします、この時点でログを確認してみると取り出したデータが日付であることがわかります。

function myFunction() {
 
  //スプレッドシートのID
  var id= "ここにスプレッドシートのIDを入れる"
  var sheet = SpreadsheetApp.openById(id);
  // 1枚目のシートを格納
  var baseSheet = sheet.getSheets()[0];
  
  // セルの範囲を指定してデータを取得
  var data = baseSheet.getRange("A1").getValues();
  
  // ログで確認する、実行後「Ctrl + Enter」で確認できる
  Logger.log(data);
  
}

ステップ②:取りこんだデータを加工する

取得したデータ(日付)を年数だけ取り出して加工します、先ほどの処理に下記コードを追記しましょう。

// データ(日付)から年数だけ取り出して「1」を足す
data[0][0] = "1/" + (data[0][0].getFullYear() + 1);
  
Logger.log(data);

追記して実行し、ログを確認してみると分数になっていることが分かります。

ステップ③:加工したデータをセルに書き出す

後はセルに書き出せば万事解決、出力先のセル(今回で言えばA2)の表示形式を「書式なしテキスト」にして先ほどのコードの下に下記を追記してください。

// セル「A2」に書き出し
baseSheet.getRange("A2").setValues(data);

完成コード

function myFunction() {
 
  //スプレッドシートのID
  var id= "ここにスプレッドシートのIDを入れる"
  var sheet = SpreadsheetApp.openById(id);
  // 1枚目のシートを格納
  var baseSheet = sheet.getSheets()[0];
  
  // セルの範囲を指定してデータを取得
  var data = baseSheet.getRange("A1").getValues();
  
  // ログで確認する、実行後「Ctrl + Enter」で確認できる
  Logger.log(data);
  
  // データ(日付)から年数だけ取り出して「1」を足す
  data[0][0] = "1/" + (data[0][0].getFullYear() + 1);
  
  Logger.log(data);
  
  // セル「A2」に書き出し
  baseSheet.getRange("A2").setValues(data);
  
}

コードを実行すると「A2」に整形後のデータが書き出されます(下)、解説してて思ったけどニッチすぎるな(;^ω^)
コードを実行すると「A2」に整形後のデータが書き出されます

結論:普通に使う分なら解説①で解決できた

普通に使う分なら解説①の内容で十分解決可能です、GASを使ってスプレットシートをデータベース化したいなど特別な理由がない限りは解説②を参考にする機会は少ないでしょう。

とはいえ、GASは覚えておいて得しかないので良い勉強になったと思います、Javascriptもある程度触れるのでそこまで難しくなかったのも大きい。

次はGAS単体でWEBスクレイピングに取り組んでみようと思います、インプットできたらまた記事にしてアウトプットしますのでその時は是非、ってな感じで今回はここまで。

人気記事「WordPressブログの作り方」←全ての手順を解説+オススメ設定

人気記事「派遣社員からプログラマーへ」←その過程で読んだ勉強本まとめ