c言語の謎を解明したい
c言語とはなんなのか複雑がすぎる
t言語はあるのかないならいつ生まれるか
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
置換しようとして上手く行かなかったコードを開示したほうが的確な助言ができると思います。
比較がうまくいかないなら、比較する前に値を表示するなどして中身を確認しましょう。
2023/10/24 02:56
for(;;) { の部分、条件を消してますか?それともこのままですか?
このままだとしたら条件が必要だと思いますが。
2023/10/24 04:47
for(;;)ですが、while(1)と同様無限ループです。
条件は、break文のところにある !rangeA です。
2023/10/24 08:13
ご返答ありがとうございます。無知で失礼いたしました。
回答1件
0
ベストアンサー
できるだけ元のコードをそのままにしてありますが、
似ていて異なる文字が使われていたりしたので、
ここからコードを全てコピペしてお試しください。
(追記)
データが異なる場合に、ログを表示するようにしました。
(追記2)
各行にコメントを入れました。
js
1function cellReplace() { 2 //このスクリプトがあるスプレッドシートから指定の名前のシートをssとして取得 3 var ss = SpreadsheetApp.getActive().getSheetByName("シート1"); 4 //データの先頭の行番号を変数nに代入 5 var n = 5; 6 //今日の日付を生成し、変数todayに格納 7 let today = new Date(); 8 //日付をyyyy/MM/ddの書式の文字列に変換して変数todayに代入 9 today = Utilities.formatDate(today, "JST", "YYYY/MM/dd") 10 //条件を設定せずに繰り返し処理を開始(無限ループ) 11 for (; ;) { 12 //B列のn行目のセル範囲をrangeBとして取得 13 var rangeB = ss.getRange("B" + n); 14 //C列のn行目のセル範囲をrangeCとして取得 15 var rangeC = ss.getRange("C" + n); 16 //A列のn行目のセル範囲に表示されている文字を変数rangeAに代入 17 var rangeA = ss.getRange("A" + n).getDisplayValue(); 18 //変数rangeAの値が無いか0(理論値で偽)のとき 19 if (!rangeA) { 20 //繰り返し処理(無限ループ)を抜ける 21 break; 22 //直近のifの条件を満たしたときの処理はここまで、 23 //elseが続くのでその後は条件を満たさなかったときの処理が始まる 24 } else { 25 //変数rangeAの値が変数todayの値と一致しない 26 //または、rangeBのセル範囲から取得した値が「記載済み」と一致しないとき 27 if (rangeA != today || rangeB.getValue() != "記載済み") { 28 //ログに変数todayの値とセル範囲rangeBから取得した値を表示 29 console.log('today: ' + today + ' rangeB: ' + rangeB.getValue()); 30 //直前のifの条件を満たしたときの処理はここまで 31 } 32 //変数rangeAの値が変数todayの値と一致し、 33 //かつ、rangeBのセル範囲から取得した値が「記載済み」と一致するとき 34 if (rangeA == today && rangeB.getValue() == "記載済み") { 35 //rangeBのセル範囲から取得した値の「記載済み」の部分を「未記載」に置換した上で 36 //rangeBのセル範囲に上書き 37 rangeB.setValue(rangeB.getValue().replace("記載済み", "未記載")); 38 //rangeCのセル範囲から取得した値の「◎」の部分を空白に置換した上で、 39 //rangeCのセル範囲に上書き 40 rangeC.setValue(rangeC.getValue().replace("◎", "")); 41 //直前のifの条件を満たしたときの処理はここまで 42 } 43 //nの値に1を加算する 44 n++; 45 //最初のifの条件を満たさなかったとき(else以降)の処理はここまで 46 } 47 //for(;;)以降の処理はここまでを繰り返す 48 } 49//for(;;)の繰り返し処理(無限ループ)を抜けたらここに到達 50}
投稿2023/10/24 04:14
編集2023/10/24 11:12総合スコア868
行ごとにセルの値を取得してから書き込んでいるので、
それなりに実行時間がかかると思います。
退会済みユーザー
2023/10/24 06:05
ご回答ありがとうございます♪
コード転記し、実行してみたのですが何も起こらず2、3秒で終了しました、、エラーは起こらなかったのでどこが悪かったんでしょう、、🥲
転記したスクリプトエディタには、上以外にコードがありますか?
退会済みユーザー
2023/10/24 06:18
上記のみです、、!
A列5行目以降の日付の表示は2023/10/24になってますか?
さらに
B列は完了でなく記載済みになっていますか?
退会済みユーザー
2023/10/24 06:23
どちらも相違なくなってます!
実行すると何も起こらない感じです、、
回答のコードを一部変更したので、差し替えてみて実行していただけますか?
退会済みユーザー
2023/10/24 06:44
ありがとうございます♪
下記、10行目が空で読み込めないとエラー吐きました、、!
TypeError: Cannot read properties of null (reading getRange)
myFunction@test.gs:10
シート名を書き換えてますか?
退会済みユーザー
2023/10/24 08:38
シート名書き換えて実行しましたが同じくエラー吐きました!
シート名が実際のシート名と合っていない時のエラーです。
シート名とスクリプト内のシート名を両方とも変更して一致する名前にしてみてください。両方ともシート2にしてみるなど。
念のためですが、実際のシート名がシート2のときは、
スクリプトは
....getSheetByName("シート2");
のようにします。全角半角の違いなどにご留意を。
なお、
"(引用符)は質問にお示しのコードでは違う文字になっていたので、
直接入力せずに、上の回答から行ごとコピペし直してから
引用符の中だけを書き換えてみてください。
退会済みユーザー
2023/10/24 09:43
ありがとうございます♪
シート名変えてみるとエラー解消されており、
実行ログにもtodayの中身とrangeBの中身も確認できました!
ただ、シート内の値は変化ありませんでした!
ログからtodayが今日の日付の行のrangeBの値がどう表示されているか教えてください。
退会済みユーザー
2023/10/24 09:52 編集
todayが2023/10/24
rangeBが未記載と出てます!
日付のどこかを全角文字で入力していたりはしませんか?
退会済みユーザー
2023/10/24 09:54
動きました!
退会済みユーザー
2023/10/24 09:56
お手数ですが動き理解したいので、コメント入れていただくこと可能でしょうか、、?
いま、外なので、落ち着いてからでよろしければ。
退会済みユーザー
2023/10/24 10:14
ありがとうございます😭
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。