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

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

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

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

Q&A

解決済

1回答

501閲覧

GASのfor文がうまく動いてくれない-2

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

0グッド

0クリップ

投稿2019/07/06 02:06

前提・実現したいこと

質問を再投稿します。
for文を使って、変数名flgに代入した値が3より大きくなったら処理を抜けるという
繰り返しの処理を行いたいのですが、ループ処理をせずに処理を抜けてしまって困っています。

全体で行っているのは、Vlookupの処理です。
シート1のA2をKeyとして、シート2よりVlookupの結果をかえし、for文で繰り返して、
シート2の参照先の列と、結果を貼り付けるシート1の行を1行ずつ、if分を使って
ずらしていく事をしています。

該当のソースコード

function mainMessage(event) {

 //スプレッドのURLを指定
var ss = SpreadsheetApp.openById("1NKWRn-z-sgXL1HaYR94XxyKeJFoQhdhYmv8s13-xC2A");
// 一覧を連想配列化
var sheet1 = ss.getSheetByName('シート2');
var sheet2 = ss.getSheetByName('シート1');
var kvRow = 2; // 開始する行数を定義(ヘッダは省く)
var lastRow = sheet1.getLastRow();

//  Logger.log(lastRow);

//**************************************************************
var i=1
Logger.log(i);
for (var flg = 0; flg < 3; flg=flg+1) {

var keyColumn = 1; // キーの列を定義

if (i = 1) { var valueColumn = 2 ; // 値の列を定義(ただしキー列<値列) } else if (i = 2) { var valueColumn = 11 ; // 値の列を定義(ただしキー列<値列) } else if (i = 3) { var valueColumn = 12 ; // 値の列を定義(ただしキー列<値列) } else { } var kvData = sheet1.getRange(kvRow, keyColumn, sheet1.getLastRow(), valueColumn).getValues(); Logger.log(kvData); var kvDic = {}; for each(var kv in kvData) { kvDic[kv[keyColumn - 1]] = kv[valueColumn - 1]; } // 値をセットする var sheet2 = ss.getSheetByName('シート1'); var startRow = 2; // 開始する行数を定義(ヘッダは省く) var targetColumn = 1; // キーになるコードの列を指定 var targetData = sheet2.getRange(startRow, targetColumn, sheet2.getLastRow(), 1).getValues(); Logger.log(targetData); var setData = []; for each(var targetRow in targetData) { setData.push([kvDic[targetRow[0]]]); } if (i = 1) { var setRow = 2 ; // 値の列を定義(ただしキー列<値列) } else if (i = 2) { var setRow = 3 ; // 値の列を定義(ただしキー列<値列) } else if (i = 3) { var setRow = 4 ; // 値の列を定義(ただしキー列<値列) } else { } var setColumn = 2; // 挿入したい列数 sheet2.getRange(setRow, setColumn, sheet2.getLastRow(), 1).setValues(setData); i=i+1; Logger.log(flg); Logger.log(i); }

試したこと

GAS初心者、プログラム未経験のため、対策がわかりません。
はじめは条件式の誤りかと思いましたが、何度やってもうまくいきません。
どこかの設定が抜けているのではと思いますが、それすらもわかりません。

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

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

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

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

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

macaron_xxx

2019/07/08 08:32

なんで再投稿してるのですか。 こちらを削除して前回の質問にて解決してください。
papinianus

2019/07/11 15:04

> 条件式の誤り だから。ifで代入するなって。===か最低でも==。
guest

回答1

0

ベストアンサー

やりたいことがさっぱり分からないけど多分こういうことかなーと。
個人的にはforにする理由がないし、そのフラグみたいなもんの出番は永久にないです。
sheet1が"シート2"だったりするのでプログラムをやろうとした人生を考え直したほうがいいレベル

javascript

1function mainMessage() { 2 const spreadsheet = SpreadsheetApp.openById("1NKWRn-z-sgXL1HaYR94XxyKeJFoQhdhYmv8s13-xC2A"); 3// pseudoVlookup(1,2,"シート1", 1, 1,"シート2",spreadsheet); 4// pseudoVlookup(1,3,"シート1", 1, 10,"シート2",spreadsheet); 5// pseudoVlookup(1,4,"シート1", 1, 11,"シート2",spreadsheet); 6 [[1,2,1,1],[1,3,1,10],[1,4,1,11]].forEach(function (e) { 7 pseudoVlookup(e[0], e[1],"シート1", e[2],e[3],"シート2", spreadsheet); 8 }) 9} 10function pseudoVlookup(keyColumn, setColumn, dstSheetName, pivotColumnNum, offset, srcSheetName, spreadsheet) { 11 const spread = spreadsheet || SpreadsheetApp.getActive(); 12 const dic = buildDic(pivotColumnNum, offset, getSheetByName(srcSheetName)); 13 const dst = spread.getSheetByName(dstSheetName); 14 const full = dst.getDataRange().getValues(); 15 const dat = full.slice(1).map(function (r) { 16 return [dic[r[keyColumn-1]] || "" ]; 17 }); 18 dst.getRange(2, setColumn, dat.length, 1).setValues(dat); 19} 20function buildDic(keyCol, offset, sheet) { 21 keyCol--; 22 return sheet.getDataRange().getValues().reduce(function (acc, r) { 23 if(!acc[r[keyCol]]) {acc[r[keyCol]] = acc[r[keyCol+offset]];} 24 return acc; 25 }, {}) 26}

投稿2019/07/11 15:03

papinianus

総合スコア12705

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

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

papinianus

2019/08/16 09:27

なんかこれ間違ってね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問