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

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

ただいまの
回答率

90.35%

  • Google Apps Script

    1475questions

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

GASのfor文について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 537

.s156412v

score 10

 前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)GoogleAppsScriptでシフト自動作成システムを作っています。
提出されたシフトを一度整理する機能を実装中に問題が発生しました。

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

とりあえず退勤時間の方を整理しようとしています。3行目に16・23・24時までというデータが入っているので16,23,24という数字が入っているのですが、24しか検知されず、24のところだけは正常に整理することができます。

 該当のソースコード

var ss = SpreadsheetApp.getActiveSpreadsheet();

var scf= ss.getSheetByName('import'); //scF=sheet_copyFrom
var lr = scf.getLastRow();
var lc = scf.getLastColumn();

var sct = ss.getSheetByName('Arrange_data'); //sct=sheet_copyTo
var lr1 = sct.getLastRow();
var lc1 = sct.getLastColumn();

var name = scf.getRange(lr,2,1,1).getValues();
//  Logger.log(name);
var name_write = sct.getRange(lr1+1,2,1,1).setValues(name);

for ( var i=3 ; i<lc ; i++ ){

var out_time = scf.getRange(lr,i,1,1).getValues();
Logger.log(i);
Logger.log(j);
Logger.log(out_time); 

if (out_time == (16,23,24) ){

if(i<=6){ var j=5 }
else if(i<=10){ var j=8}
else if(i<=14){ var j=11}
else if(i<=18){ var j=14}
else if(i<=22){ var j=17}
else if(i<=26){ var j=20}
else if(i<=30){ var j=23}
else if(i<=34){ var j=26}
else if(i<=38){ var j=29}
else if(i<=42){ var j=32}
else if(i<=46){ var j=35}
else if(i<=50){ var j=38}
else if(i<=54){ var j=41}
else if(i<=58){ var j=44}
else if(i<=62){ var j=47}
else          { var j=50};

var out_time = scf.getRange(lr,i,1,1).getValues();
//Logger.log(i);
//Logger.log(j);
Logger.log(out_time);     
var out_time_write = sct.getRange(lr1+1,j,1,1).setValues(out_time);

} else {      
//Logger.log(i);
//Logger.log(j);
//Logger.log(out_time);  

}
}

GAS

 試したこと

out_timeをforの外に出したりしましたがダメでした。

 補足情報(FW/ツールのバージョンなど)

もしろよろしければ、Aシートのどこかの行にある田中という苗字を検知し、その行のデータをコピーし、Bシートの固定された田中の行にコピーさせる為にはどうすればいいでしょうか。こちらも併せて教えていただきたいです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • hot-lemoned

    2018/08/03 13:18

    var out_time = scf.getRange(lr,i,1,1).getValues(); で取得した値はどのようになっているのでしょうか?もしくは引用元のシート(import)の内容を追記していただけますか?

    キャンセル

  • macaron_xxx

    2018/08/03 13:26

    ちょっとその日本語ではどこにどんなデータが入っていて何がしたいのか理解できません。もう少し整理して落ち着いて質問内容を考えてください。

    キャンセル

  • .s156412v

    2018/08/04 10:42

    ありがとうございます!始めたばっかりで、こちらのサイトを使わせて頂いたので、自分でもよくわからない質問だと自負しております。考えていただきありがとうございました!

    キャンセル

回答 1

checkベストアンサー

+1

とりあえず、if (out_time == (16,23,24) ){if (out_time == 16 || out_time == 23 || out_time == 24) ){としてください。話はそれからです。

-- iとjのifの件
var j = trunc(i);とするだけでこの膨大なifをやめることができます。
なおtruncは下記のように作りました(5に、iから6を引いて4ごとに3を足す、という意味と理解しました。そうでなくても意味を考えれば算数で求まるはずです)。

function testTrunc() {
  Logger.log([6,7,8,9,10,11].map(function(element, index, array) {
    return trunc(element);
  }));
}
function trunc(i) {
  return 5 + (Math.floor((i - 6) / 4) * 3);
}

-- 田中さんの件
要件がわからなすぎます。
test()内のシート1がコピー元シート名、シート2がコピー先シート名、範囲を指定するとコピーできます。
ただし、範囲は、両方のシートで同じで、全く同じデータ構成で、まるっと上書きすることが前提です。
(列の構成が違う場合は詳細な仕様を開示していただかないとサンプルコードは書くことができません)

(ちなみに田中さんが2人以上いたばあい、コピー元も先も最初に出て来た人からコピーし、最初に出て来た人にコピーする、という動きになります)

function test() {
  CopyDat("シート1", "シート2", "A1:F3", "田中", 0);
}
function CopyDat(srcSheetName, dstSheetName, range , needle , col) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var src = spreadsheet.getSheetByName(srcSheetName).getRange(range).getValues();

  var filtered = src.filter(function(element, index, array) {
    return (element[col] === needle);
  });
  if(filtered.length === 0) { spreadsheet.toast(needle + "が見つかりませんでした"); return; }
  var dst = spreadsheet.getSheetByName(dstSheetName).getRange(range).getValues();
  for(var i = 0; i < dst.length; i++) {
    if(dst[i][col] != needle) { continue; }
    dst[i] = filtered[0];
  }
  spreadsheet.getSheetByName(dstSheetName).getRange(range).setValues(dst);
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/04 10:43

    ありがとうございます!!
    始めたばかりで右も左も分からない状態なのでもう少し勉強してきます!

    キャンセル

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

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

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

  • Google Apps Script

    1475questions

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