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

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

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

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

Google Apps Script

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

2回答

4057閲覧

S3.getObject で文字化け

what_on_earth

総合スコア4

Google スプレッドシート

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

Google Apps Script

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2022/04/18 08:01

編集2022/04/18 10:33

Amazon S3 から Google Drive にファイルをコピーする GAS スクリプトを書いています。S3上のファイルの文字コードが ascii, utf-8 の場合は問題なくコピーできたのですが、sjis では文字化けしてしまいます。文字化けさせない方法はないでしょうか。アドバイス頂けますと助かります。もしくは「sjisは使えませんよ」という情報でも結構です。よろしくお願いします。

function TEST_getS3File() {

let bucketName = "hogehoge"; //S3 のバケット名
let fileName = "xxxx.csv"; //取得する S3 上のファイル名
let csvFolder = DriveApp.getFolderById("xxxxxxxxxxxx"); //取得したファイルを配置する Google Drive のフォルダ

let ACCESS_KEY_ID = ""; //AWS_ACCESS_KEY_ID
let SECRET_ACCESS_KEY = ""; //AWS_SECRET_ACCESS_KEY
let s3 = S3.getInstance( ACCESS_KEY_ID, SECRET_ACCESS_KEY );

let data = s3.getObject( bucketName, fileName );

let csvFolder.createFile( fileName, data );

}

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

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

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

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

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

guest

回答2

0

下記のようにして読み込むことで、文字化けしていない文字列(CSV)データとして読み込める可能性はあります。

js

1() 2let data = s3.getObject( bucketName, fileName ); 3let csvdata = data.getDataAsString('shift-jis'); 4 5// 以下、 csvdata をCSVデータとして処理

投稿2022/04/18 13:55

編集2022/04/18 14:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

what_on_earth

2022/04/19 00:14

アドバイスありがとうございます! 早速教えていただいた1行を追加してみましたが、 let csvdata = data.getDataAsString('shift-jis'); 以下のエラーが返ってきました。 TypeError: data.getDataAsString is not a function ネットで.getDataAsString()を調べて試しに .getBlob() を追加してみましたが、 let csvdata = data.getBlob().getDataAsString('shift-jis'); 同じようなエラーが返ってきました。 TypeError: data.getBlob is not a function
退会済みユーザー

退会済みユーザー

2022/04/19 03:41

let data = s3.getObject( bucketName, fileName ); のあとに console.log(data) を追加して実行した場合、 どう表示されますか?
what_on_earth

2022/04/20 01:47

ファイルの中身は以下のようになっています テスト,テスト,テスト テスト,テスト,テスト コンソールログは以下のようになっています。 [22-04-20 10:44:40:217 JST] �e�X�g,�e�X�g,�e�X�g �e�X�g,�e�X�g,�e�X�g
what_on_earth

2022/04/21 04:46 編集

S3.getObject で返ってくる値が String だとわかったので、 UTF8 を SJIS 変換できるか試したところ、これは成功したようです。 (前略) let fileName = "utf8.csv"; let data = s3.getObject( bucketName, fileName ); let sjisdata = Utilities.newBlob('').setDataFromString(data, 'shift-jis').getDataAsString(); Logger.log("ファイル名 "+fileName); Logger.log("元データ \n"+data); Logger.log("SJIS変換後 \n"+sjisdata); ---------- 実行結果ログ ここから ---------- [22-04-21 13:28:06:088 JST] ファイル名 utf8.csv [22-04-21 13:28:06:089 JST] 元データ テスト,テスト,テスト テスト,テスト,テスト [22-04-21 13:28:06:093 JST] SJIS変換後 �e�X�g,�e�X�g,�e�X�g �e�X�g,�e�X�g,�e�X�g ---------- 実行結果ログ ここまで ---------- 逆に、SJIS を UTF8 変換できるか試したところ、うまく変換できていないようです。 (前略) let fileName = "sjis.csv"; let data = s3.getObject( bucketName, fileName ); let utf8data = Utilities.newBlob('').setDataFromString(data, 'utf-8').getDataAsString(); Logger.log("ファイル名 "+fileName); Logger.log("元データ \n"+data); Logger.log("UTF8変換後 \n"+utf8data); ---------- 実行結果ログ ここから ---------- [22-04-21 13:37:46:878 JST] ファイル名 sjis.csv [22-04-21 13:37:46:879 JST] 元データ �e�X�g,�e�X�g,�e�X�g �e�X�g,�e�X�g,�e�X�g [22-04-21 13:37:46:882 JST] UTF8変換後 �e�X�g,�e�X�g,�e�X�g �e�X�g,�e�X�g,�e�X�g ---------- 実行結果ログ ここまで ---------- sjis.csv だと文字コード変換もできないので、S3.getObject から受け取った data に何か問題ありそうな気がします。ギブアップ気味です。
退会済みユーザー

退会済みユーザー

2022/04/21 11:01 編集

・getObjectでは、Blobではなく、文字列が返ってくる。 ・そしてその文字自体が文字化けしている ということですよね? ということは、アップロード時点で、「文字化けした文字列をアップロードしてしまっている可能性」が高いです。 そして、後半で試して「sjis.csv だと文字コード変換もできない」とおっしゃっている通り、文字化けしている「�e�X�g,�e�X�g,�e�X�g 」という文字列自体、もともとのshift-jisでエンコードされているデータの情報が一部失われてしまっているため、 復元できないのだと思います。 (すなわち、S3に「もともとのshift-jisでエンコードされている情報の一部が失われてしまっている状態のデータ」がアップロードされている)
what_on_earth

2022/04/22 02:11 編集

sjis.csv 自体が壊れている可能性を疑い、S3 アップロード前に Excel と Numbers で開けることを確認し、さらに再ダウンロードして Excel と Numbers で開けることを確認しました。テスト用のファイル以外でも同じように試し、問題ありませんでした。 どうにもお手上げなので s3.getObject で sjis ファイルの取得は諦めまして、S3 にファイルを置く際に utf8 に変換していただくことにしました(外部のベンダーさん)。ちょっと悔しいです。 qnoir さんにはアドバイス感謝いたします。ありがとうございました。
guest

0

たんにSJISのファイルをUTF8で読んでしまってるから文字化けしてるように見えるだけでは

SJISのファイルは、SJISで読みましょうよ

投稿2022/04/18 13:20

編集2022/04/18 13:21
y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問