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

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

ただいまの
回答率

88.81%

GAS:スプレッドシート内のセルの範囲を取得し、値を条件に合わせて置換したい。

解決済

回答 1

投稿

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

takamon

score 6

getShiftValuesメソッドで、
1:シフト表の月の最終日を取得
2:その日数分繰り返す処理を実施
①処理
3:シフト表の1日の値を取得
4:chengeShiftValuesメソッドでその値を以下の様に処理
②処理
5:2次元配列で取得されていたので、取得された1次元配列の回数だけループ
6:ループ内容は1列分取得した値を2次元配列の数だけ値をチェック
7:switch文でシフト表に記載の値に対して、対応する文字列に置換を実施
81列分すべて実施したら、配列shiftをリターン
②処理終了
9:もどってきた値をスプレッドシートの同じ場所にセット
①処理を日数分実施して終了

としたかったのですが、うまくいかず困っています。

うまくいかなかった内容としては、
まず置換が実施されなかったり、
最初の二次元配列shift[i][j]が空になって、他の値はそのままだったり。

いろいろと値を変更したりしてみたのですが、
うまくいかず、もしもアドバイスいただけたらと思い、記載しました。

最終的には、置換した値を別シートの指定したセル範囲に記載したいと思っています。
説明が足りない部分があるかもしれませんが、何かお分かりいらっしゃいましたら
ご指導の程よろしくお願いいたします。

//シフトの値を取得して返還後にセットする
function getShiftValues() {
  var lastDay = findLastDays();
  var startCol = 3;
  var shiftSheet = getShiftSheet();

  for (var i = 1; i <= lastDay; i++) {
    var shift = shiftSheet.getRange(5, startCol + i, 37).getValues();
    shift = chengeShiftValues(shift);
    shiftSheet.getRange(5, startCol + i, 37).setValues(shift);
    //    return shift;
  }
}

//シフトの値を変更する
function chengeShiftValues(shift) {
  for (var i = 0; i < shift.length; i++) {
    for (var j = 0; j < shift[i].length; j++) {
      switch (shift[i][j]) {
        case 'M①':
          shift[i].splice(j, 1, 'マネージャー①');
          break;
        case 'M②':
          shift[i].splice(j, 1, 'マネージャー②');
          break;
        case 'M③':
          shift[i].splice(j, 1, 'マネージャー③');
          break;
        case 'M④':
          shift[i].splice(j, 1, 'マネージャー④');
          break;
        case 'M⑤':
          shift[i].splice(j, 1, 'マネージャー⑤');
          break;
        case '制①':
          shift[i].splice(j, 1, '制作①');
          break;
        case '制②':
          shift[i].splice(j, 1, '制作②');
          break;
        case '制③':
          shift[i].splice(j, 1, '制作③');
          break;
        case '制④':
          shift[i].splice(j, 1, '制作④');
          break;
        case '制⑤':
          shift[i].splice(j, 1, '制作⑤');
          break;
        case '制⑥':
          shift[i].splice(j, 1, '制作⑥');
          break;
        case '制⑦':
          shift[i].splice(j, 1, '制作⑦');
          break;

        default:
          shift[i].splice(j, 1, '');
          break;
      }
    }
    Logger.log(shift);
    return shift;
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mkk

    2020/09/28 15:42

    配列に具体的にどんな値が入ってくるか分かりませんが、まずはデバッグ実行をしながら、
    どこで想定している動きと違うようになっているのか検証してみてはいかがでしょうか。
    少なくとも確認すべきは

    > var shift = shiftSheet.getRange(5, startCol + i, 37).getValues();
    でshiftに欲しい値が入っているか

    switch-case文で、きちんと想定しているcase内に入っていくか

    shift[i].splice をした直後の値は正常か

    の辺りかと思います。

    キャンセル

  • takamon

    2020/10/01 00:22

    ご回答ありがとうございます。
    こちら確認しながら行なっておりましたが、
    ご指摘いただいた部分はコンソール表示などしてませんでした。
    もう少しもがいてみます。

    キャンセル

  • mkk

    2020/10/01 09:50

    コンソール表示の結果から問題の箇所が絞れれば、解決にかなり近づくと思います。
    ぜひご確認下さい。

    キャンセル

回答 1

check解決した方法

0

繰り返し処理の回数を明確にして、
それに当たるのは何の数かを考えました。
そして、それを事前に取得して、for文の条件式に組み込みました。
一つずつの動産の後にどのような状態になっているか、Logger.logで確認を繰り返して、
その値をどうしたいかを考えながら実行しました。

function chengeAndsetValues() {
  var year = getMakingYear();
  var month = getMakingMonth();
  var lastDay = findLastDays();
  var startCol = 3;
  var shiftSheet = getShiftSheet();

  for (var i = 1; i <= lastDay; i++) {
    var day = ("00" + i).slice(-2);

    var shiftRanges = shiftSheet.getRange(6, startCol + i, 38, 1);//③
    var shiftValues = shiftRanges.getValues();
    var AdjustmentValues = Array.prototype.concat.apply([], shiftValues);
    var valuesCount = AdjustmentValues.length;

    // Logger.log(valuesCount);//38
    // Logger.log(shiftValues);//二次元配列の値
    // Logger.log(shiftValues.length);//1

    for (var j = 0; j < shiftValues.length; j++) {
      for (var k = 0; k < valuesCount; k++) {
        if (shiftValues[j][k] === "M①") {
          shiftValues[j].splice(k, 1, 'マネージャー①');
        }
        if (shiftValues[j][k] === "M②") {
          shiftValues[j].splice(k, 1, 'マネージャー②');
        }
        if (shiftValues[j][k] === "M③") {
          shiftValues[j].splice(k, 1, 'マネージャー③');
        }
        if (shiftValues[j][k] === "M④") {
          shiftValues[j].splice(k, 1, 'マネージャー④');
        }
        if (shiftValues[j][k] === "M⑤") {
          shiftValues[j].splice(k, 1, 'マネージャー⑤');
        }
        if (shiftValues[j][k] === "制①") {
          shiftValues[j].splice(k, 1, '制作①');
        }
        if (shiftValues[j][k] === "制②") {
          shiftValues[j].splice(k, 1, '制作②');
        }
        if (shiftValues[j][k] === "制③") {
          shiftValues[j].splice(k, 1, '制作③');
        }
        if (shiftValues[j][k] === "制④") {
          shiftValues[j].splice(k, 1, '制作④');
        }
        if (shiftValues[j][k] === "制⑤") {
          shiftValues[j].splice(k, 1, '制作⑤');
        }
        if (shiftValues[j][k] === "制⑥") {
          shiftValues[j].splice(k, 1, '制作⑥');
        }
        if (shiftValues[j][k] === "制⑦") {
          shiftValues[j].splice(k, 1, '制作⑦');
        }
        if (shiftValues[j][k] === "制⑧") {
          shiftValues[j].splice(k, 1, '制作⑧');
        }
        if (shiftValues[j][k] === "制") {
          shiftValues[j].splice(k, 1, '制作');
        }
        if (shiftValues[j][k] === "選") {
          shiftValues[j].splice(k, 1, '選挙');
        }
        if (shiftValues[j][k] === "特1") {
          shiftValues[j].splice(k, 1, '特集①');
        }
        if (shiftValues[j][k] === "特2") {
          shiftValues[j].splice(k, 1, '特集②');
        }
        if (shiftValues[j][k] === "ES") {
          shiftValues[j].splice(k, 1, 'EASY');
        }
        if (shiftValues[j][k] === "特3") {
          shiftValues[j].splice(k, 1, '特集③');
        }
        if (shiftValues[j][k] === "地1") {
          shiftValues[j].splice(k, 1, '地域①');
        }
        if (shiftValues[j][k] === "地2") {
          shiftValues[j].splice(k, 1, '地域②');
        }
        if (shiftValues[j][k] === "朝L") {
          shiftValues[j].splice(k, 1, '朝リーダー');
        }
        if (shiftValues[j][k] === "朝1") {
          shiftValues[j].splice(k, 1, '朝①');
        }
        if (shiftValues[j][k] === "昼1") {
          shiftValues[j].splice(k, 1, '昼①');
        }
        if (shiftValues[j][k] === "昼2") {
          shiftValues[j].splice(k, 1, '昼②');
        }
        if (shiftValues[j][k] === "昼3") {
          shiftValues[j].splice(k, 1, '昼③');
        }
        if (shiftValues[j][k] === "昼L") {
          shiftValues[j].splice(k, 1, '昼リーダー');
        }
        if (shiftValues[j][k] === "夜L") {
          shiftValues[j].splice(k, 1, '夜リーダー');
        }
        if (shiftValues[j][k] === "夜1") {
          shiftValues[j].splice(k, 1, '夜①');
        }
        if (shiftValues[j][k] === "休") {
          shiftValues[j].splice(k, 1, '休');
        }
        if (shiftValues[j][k] === "") {
          shiftValues[j].splice(k, 1, '');
        }
      }
    }
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var targetSheet = ss.getSheetByName(year + month + day);
    targetSheet.getRange(7, 2, 38, 1).setValues(shiftValues);//③

  //  Logger.log(ss);
  //  Logger.log(targetSheet);
  //  Logger.log(shiftValues);
  }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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