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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1273閲覧

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

takamon

総合スコア7

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/09/28 02:38

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; } }

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

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

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

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

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

mkk

2020/09/28 06:42

配列に具体的にどんな値が入ってくるか分かりませんが、まずはデバッグ実行をしながら、 どこで想定している動きと違うようになっているのか検証してみてはいかがでしょうか。 少なくとも確認すべきは > var shift = shiftSheet.getRange(5, startCol + i, 37).getValues(); でshiftに欲しい値が入っているか switch-case文で、きちんと想定しているcase内に入っていくか shift[i].splice をした直後の値は正常か の辺りかと思います。
takamon

2020/09/30 15:22

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

2020/10/01 00:50

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

回答1

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); } }

投稿2020/10/04 22:35

takamon

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問