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

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

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

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

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

Q&A

解決済

2回答

1514閲覧

スクリプトを使用し、他のファイルからデータを転記した際、日付のシリアル値が変わってしまう。

mattsuncaca

総合スコア2

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

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

0グッド

1クリップ

投稿2021/11/05 10:36

前提

スクリプトを用いて、下記の動作を実現しました。
・GoogleDrive上のほかフォルダにアップロードされたExcelファイルのシートを、ファイル名で探す
・Excel形式からスプシ形式に変換し、コピー
・現在のスプシの特定のシートに貼り付け

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

しかし、スプシに貼り付けられたデータのうち、
元データのA列は日付("yyyy/m/d"形式)なのですが、なぜか

例) 元のエクセルA1のデータ └2021/11/1(※シリアル値:44501) 貼付け後のA1のデータ └2021/11/01 16:00:00(※シリアル値:44501.6666666667)

となってしまい、その後の操作で非常に都合が悪いです。
(アメリカ時間が基準になっている??)

日付が変わらず、"yyyy/m/d"形式になるよう、コントロールできれば最高です。

該当のソースコード

コードをすべて記載しました。各箇所の概要はコメントアウトで記載しています。
個人的には、おそらくExcelからスプシ形式に変換する部分で何か起こってるのではと思います・・・。

GAS

1function PastePlan() { 2 //現在のスプシのidと、貼り付け対象のシートを取得 3 const Spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 const thisSsId = Spreadsheet.getId(); 5 Logger.log(thisSsId); 6 const pasteSheet = Spreadsheet.getSheetByName('予測'); 7 8 //コピー元データのExcelファイルを名前から取得 9 const folder = DriveApp.getFolderById('1PSSwUksFZTHGdWQU351EUBgOHDlMTJBM');//ロ―データフォルダのID 10 const files = folder.getFilesByName('plan_' + thisSsId + '.csv'); 11 const file = files.next(); 12 Logger.log(file); 13 14 //おそらく、Excelからスプシへの変換で必要な操作(ネット上のコード) 15 options = { 16 title : file.getName(), 17 mimeType: MimeType.GOOGLE_SHEETS, 18 parents : [{ id: folder.getId() }] 19 } 20 21 //スプシ形式に変換したコピー元データのシートから、すべての値を取得 22 const newSs = SpreadsheetApp.openById(Drive.Files.insert(options, file.getBlob()).id); //ExcelをSSに変換し取得 23 const newSheet = newSs.getActiveSheet(); 24 const values = newSheet.getDataRange().getValues(); 25 26 //下記ですでに、「Mon Nov 01 16:00:00 GMT+09:00 2021」の表示 27 Logger.log(values[1][0]); 28 29 30 //現在のスプシの貼り付け先シートに、コピーした範囲を貼り付け 31 pasteSheet.getRange(1, 2, values.length, values[0].length).setValues(values); 32 33 //スプシ形式に変換したファイルをゴミ箱に移動 34 //DriveAppクラスからファイルIDでファイル一意に取得する 35 const fileData = DriveApp.getFileById(newSs.getId()); 36//IDから取得したファイルをゴミ箱のフラグをtrueにする 37 const getData = fileData.setTrashed(true); 38}

試したこと

前任者は、似た状況で、下記のコードで対応しているぽいですが、僕のスキルレベルでは分かりませんでした><

plansheet_copyFrom.getRange(2,1,lastRow1-1,1).setNumberFormat(dateFormats); var copyValue = plansheet_copyFrom.getRange(2,1,lastRow1-1,lastCol1).getValues(); Sheet2.getRange(2,2,lastRow1-1,lastCol1).setValues(copyValue); var copyValuedate = []; for (var i = 0; i <= copyValue.length-1 ; i++) { var Value = Utilities.formatDate(copyValue[i][0], "Asia/Tokyo", dateFormats); var c_date = Value.toString(10);; copyValuedate[i] = c_date; }

ネットでいろいろ検索してみましたが、同様のパターンが見つからず途方に暮れているので、
皆様の力をお借りできれば幸いです。

GASをいじり始めて1週間たたない、基礎概念もおぼろな初心者ですが、何卒、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

貼り付け後の値が、2021/11/01 16:00:00となるのは、
csvから変換した後のGoogleスプレッドシートのタイムゾーンが
日本標準時の地域以外に設定されてしまうことが原因と推測されます。

(変換後のスプレッドシートのメニューから「ファイル」->「設定」を選択して開いた例)
イメージ説明

したがって、下記のように、変換後のGoogleスプレッドシートのタイムゾーンを「Asia/Tokyo」に設定すれば期待する動作になるのではないでしょうか。

diff

1function PastePlan() { 2 //現在のスプシのidと、貼り付け対象のシートを取得 3 const Spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 5~略~ 6 7 //スプシ形式に変換したコピー元データのシートから、すべての値を取得 8 const newSs = SpreadsheetApp.openById(Drive.Files.insert(options, file.getBlob()).id); //ExcelをSSに変換し取得 9 10+ // 変換後のスプレッドシートのタイムゾーンをAsia/Tokyoに設定しなおす。 11+ newSs.setSpreadsheetTimeZone("Asia/Tokyo"); 12 const newSheet = newSs.getActiveSheet(); 13 const values = newSheet.getDataRange().getValues(); 14(以下略)

"yyyy/m/d"形式になるよう、コントロール

貼り付け先の書式を「yyyy/m/d」形式にして貼り付けます。

diff

1(略) 2 //現在のスプシの貼り付け先シートに、コピーした範囲を貼り付け 3- pasteSheet.getRange(1, 2, values.length, values[0].length).setValues(values); 4+ pasteSheet.getRange(1, 2, values.length, values[0].length).setNumberFormat('yyyy/m/d').setValues(values); 5

--- 

・全体コード

function PastePlan() { //現在のスプシのidと、貼り付け対象のシートを取得 const Spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const thisSsId = Spreadsheet.getId(); Logger.log(thisSsId); const pasteSheet = Spreadsheet.getSheetByName('予測');  //コピー元データのExcelファイルを名前から取得 const folder = DriveApp.getFolderById('1PSSwUksFZTHGdWQU351EUBgOHDlMTJBM');//ロ―データフォルダのID const files = folder.getFilesByName('plan_' + thisSsId + '.csv'); const file = files.next(); Logger.log(file); //おそらく、Excelからスプシへの変換で必要な操作(ネット上のコード) options = { title : file.getName(), mimeType: MimeType.GOOGLE_SHEETS, parents : [{ id: folder.getId() }] }  //スプシ形式に変換したコピー元データのシートから、すべての値を取得 const newSs = SpreadsheetApp.openById(Drive.Files.insert(options, file.getBlob()).id); //ExcelをSSに変換し取得 // 変換後のスプレッドシートのタイムゾーンをAsia/Tokyoに設定しなおす。 newSs.setSpreadsheetTimeZone("Asia/Tokyo"); const newSheet = newSs.getActiveSheet(); const values = newSheet.getDataRange().getValues(); Logger.log(values[1][0]); //現在のスプシの貼り付け先シートに、コピーした範囲を貼り付け pasteSheet.getRange(1, 2, values.length, values[0].length).setNumberFormat('yyyy/m/d').setValues(values); //スプシ形式に変換したファイルをゴミ箱に移動 //DriveAppクラスからファイルIDでファイル一意に取得する const fileData = DriveApp.getFileById(newSs.getId()); //IDから取得したファイルをゴミ箱のフラグをtrueにする const getData = fileData.setTrashed(true); }

投稿2021/11/06 00:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mattsuncaca

2021/11/09 05:47

ありがとうございます! まさにこちらで、希望通りの挙動になりました!
guest

0

過去に私も同様の問題があったのでこちら張っておきます。
Googleスプレッドシートに数値や文字列を含めた配列を貼ったときに、頭が0で始まる数値が消える問題

ヒント程度ですが、
sheet.getRange().setNumberFormats().setValues();
という感じにフォーマットを張る様にするともしかしたらうまくいくかもしれません。

今後ずっと固定したセルに張り続ける場合は、事前に書式を設定するだけでもいけるかもしれません。

すでにテスト済みの場合は私もわからない感じですので悪しからずよろしくお願いします。

投稿2021/11/05 11:31

takaD

総合スコア315

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問