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

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

ただいまの
回答率

88.58%

【GAS】doPost 日本語が取得できない【Excel VBA】

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,235

lazyAnt

score 12

当方、VBAとGASを勉強中の身のものです。
つたない説明でわかりづらい部分もあると思いますがご教示願います。

業務でIEでないと動作しないWEBシステムを使用しており
システムからデータをコピペすることが多々発生していたので
下記等を参考にしながらExcelVBAでスクレイピングができるようにしました。
https://tonari-it.com/ie-setting-navigate/

すると一部の部署から
スクレイピングしたデータをGoogleスプレッドシートへ自動で入力できないかと言われ
下記の過去記事を参考にしスプレッドシートへ転記する流れはでき、
半角英数字に関しては問題なく転記することもできました。

しかし下記コードで param2 に格納している日本語だけ空値になってしまいました。
日本語と半角英数字を混在させると日本語のみ認識されず
「1あ2」と入れると「12」とスプレッドシート上では値が貼り付けられてしまいました。

GAS側で e のcontentLength では日本語の分もカウントしているようではあるのですが
parameterを見るとやはり日本語だけ認識されていない状態になっていました。

日本語の処理に関して記述している記事などが見つからずご質問をさせていただいています。
そもそも日本語は処理できないものなのでしょうか?それすらもわからないので
諦めようにも諦められない状況です。
それか他に何か良い方法があればご教示いただきたいのでよろしくお願いいたします。

【VBA】【GAS】VBAで送信し、webアプリケーションで処理させたい。

作成したサンプルコードは下記になります。

Public Sub html_post()

'   参照設定
'   Microsoft XML, v6.0

    Dim httpReq As XMLHTTP60
    Set httpReq = New XMLHTTP60
    Dim param As Variant
    Dim url As String
    url = "ウェブ アプリケーションの URL"

    With httpReq
        .Open "POST", url, False
        Call .setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
        param = _
            "param1=" & "TEST&" & _
            "param2=" & "テスト&" & _
            "param3=" & "123&" 
        .send (param)
    End With
    Set httpReq = Nothing
End Sub
function doPost(e) {
  var Id = 'スプレッドシートID';
  var ss = SpreadsheetApp.openById(Id);
  var sh = ss.getSheetByName('log');
  var maxRow = sh.getRange('A:A').getValues().filter(String).length + 1;
  try {
    var params = e.parameter
    var ADD_LIST = [[
      params.param1,
      params.param2,
      params.param3
    ]];

    sh.getRange(maxRow,1,ADD_LIST.length,ADD_LIST[0].length).setValues(ADD_LIST);
  } catch(ex) {
    sh.getRange(maxRow, 1).setValue('error');
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

仕様を見た訳ではないですが、encodeだろうなーと思ってやってみました。

同じ問題を再現したうえで、下記のような手当をしたところ、「テスト」が書かれるようになりました。

Public Sub html_post()

'   参照設定
'   Microsoft XML, v6.0

    Dim httpReq As XMLHTTP60
    Set httpReq = New XMLHTTP60
    Dim param As Variant
    Dim url As String
    url = "ウェブ アプリケーションの URL"

    ' encodeUrl
    Dim objSC As Object
    Dim encodeUrlUtf8 As String
    Set objSC = CreateObject("ScriptControl")
    objSC.Language = "Jscript"
    encodeUrlUtf8 = objSC.CodeObject.encodeURIComponent("テスト")
    Set objSC = Nothing


    With httpReq
        .Open "POST", url, False
        Call .setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
        param = _
            "param1=" & "TEST&" & _
            "param2=" & encodeUrlUtf8 & "&" & _
            "param3=" & "123&"
        .send (param)
    End With
    Set httpReq = Nothing
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/24 11:42

    おっしゃる通りにやってみたところ無事転記ができました!!
    こんなに早くご返信していただきありがとうございます!

    Excel側でencodeをこのように変換する方法初めて知りました
    GAS側の部分ばかり調べていましたのでわからなかったはずです。

    関数化して私用させていただきたいと思います。
    ありがとうございました!

    キャンセル

  • 2018/10/24 11:52

    > GAS側の部分ばかり調べていましたのでわからなかったはずです。
    chromeのアプリ(拡張機能)で、postを手動作成できるツールがあって(例えばPOSTMAN)、そういうのでチェックすると、GAS(受け手)なのか、VBA(送り手)なのか、問題の切り分けができます。私自身、postmanでいけたので、VBAでencodeURIをやってみるかなーと思いました。

    キャンセル

  • 2018/11/14 17:29

    ご返信遅くなってしまいすみません!
    postman ですが、こちらも知りませんでした。。。
    デベロッパーツールも使ったことがないのでこれを機に使用し始めてみます^^
    とりあえずpostmanの使い方を調べつつインストールしてみます!
    回答だけでなくアドバイスもいただき本当にありがとうございます!

    キャンセル

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

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る