🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

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

Google Apps Script

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

539閲覧

回答フォームから顧客マスタへメールアドレスを吸い上げたい

Sou23

総合スコア38

Google スプレッドシート

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

Google Apps Script

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/03/23 13:18

編集2021/03/24 00:16

前提・実現したいこと

回答フォームから顧客マスタへメールアドレスを吸い上げたいです。
連想配列を使用してみました。

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

処理が全く進みません。

該当のソースコード

GAS

1function copyemailaddress() { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var sheet = ss.getSheetByName('真顧客マスタ'); 4 var rows = sheet.getLastRow(); 5 var columns = sheet.getMaxColumns(); 6 var range = sheet.getRange(2,1,rows,columns); 7 var datas = range.getValues(); 8 9 var sheet1 = ss.getSheetByName('フォームの回答 1'); 10 var rows1 = sheet1.getLastRow(); 11 var columns1 = sheet1.getMaxColumns(); 12 var range1 = sheet1.getRange(2,1,rows1,columns1); 13 var datas1 = range1.getValues(); 14 15//回答シート取得 16 var object = {}; 17 18 for(var i = 3; i < datas1.length; i++){ 19 var codevalue = datas1[i][5]; 20 var emailvalue = datas1[i][17]; 21 object[codevalue] = emailvalue; 22 23 } 24//真顧客マスタ取得 25for(var p=2; p<=datas.length; p++){ 26 var emailplace = sheet.getRange(p,10); 27 var code = sheet.getRange(p,1).getValue(); 28 29 30 31if(emailplace.isBlank()){ 32emailplace.setValue(object[code]); 33 }//if done 34 }//for done 35 36} 37 38

試したこと

object[codevalue]のログが「情報」としか表示されませんがそういうものでしょうか。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

GAS

1 var code = sheet.getRange(p,1).getValue(); 2 3 4if(emailplace.isBlank()){ 5emailplace.setValue(object[codevalue]); 6 7 }//if done

真顧客マスタからのコードの取得の部分が「code」になっていて
setValueする時はobject[codevalue]になってますが
object[code]の間違いではないですか?

投稿2021/03/23 14:13

xail2222

総合スコア1508

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

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

Sou23

2021/03/24 00:18

ありがとうございます。その通りだと思ってそのように修正したのですが(このページのコードも修正したものに書き換えました)、依然メールアドレスは入力されませんでした。ログではcode,codevalue,emailvalueどれも動いているので、なぜなのかわかりません。恐れ入りますが引き続きお力をお借りできれば幸いです。
xail2222

2021/03/24 01:07 編集

ぱっと見おかしそうな所は見つけられないです code,codevalue,emailvalue全てログに出してみて確認出来ますか? まぁ私がやるなら、デバッグしてステップ実行してるかな (追記) 気になったのですが if(emailplace.isBlank()){ の中には入ってきてますか? もしかして、1度誤ったコードで流した為、空文字がセットされているとかって事ありませんか?
xail2222

2021/03/24 02:20

空文字でもisbrankはtrueになるみたいですね 失礼しました。
Sou23

2021/03/24 09:10

ありがとうございます。ログを取ったところ、iの方のfor文の中に最後のifまで入れてあげないとcodevalue, emailvalueの設定が消えてしまうようでしたので入れてみたところ、動き始めました。 しかし今度は最初に顧客コードを見つけたところを何回もログを取っており、そしてこの顧客マスタは20000件ありますので、最悪これを20000回繰り返すのではないかと思います。 設計自体に無理があったのでしょうか。
xail2222

2021/03/24 15:33 編集

デバッグでステップ実行しながら、変数の中身をチェックしていますか? とりあえず、注意点としては、getValuesすると0から始まる配列になるため var codevalue = datas1[i][5]; var emailvalue = datas1[i][17]; これは i 行 5列と17列 ではありません。 i +2行 6列=F列と18列=R列です。 ここの認識は合ってますか? (他の質問のコードを見させてもらいましたが分ってますよね。失礼しました) codevalue, emailvalueの設定が消えてもobject は残っているので ループは初めのままで問題ないはずです。 データ数が多くて大変というのであればテスト用に データ量を少なくしたシートでテストをするのもありだと思いますよ。
Sou23

2021/03/25 07:37

恥ずかしながらデバックでステップ実行という作業をやったことがなく、これから調べてやってみたいと思います。 またループにつきましてありがとうございます。 データ量を減らしたシートも作成してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問