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

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

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

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

Q&A

解決済

2回答

275閲覧

Google Apps Scriptでスプレッドシート中にある特定の値を検索し、合致する場合に日付を入力する動作の実現

kenn99

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2020/11/18 14:25

編集2020/11/18 14:28

前提・実現したいこと

Google Apps Scriptを利用し、スプレッドシートにて「確認結果シート」に記入された管理番号から「物品管理シート」に記載されている管理番号を検索し、合致する番号があった場合に同じ行の確認日付欄(24列目)に日付を自動入力する動作を実現したいです。

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

「物品管理シート」の1行目〜50行目ぐらいまでは日付が自動入力されますが、50行目ぐらいから自動入力されなくなってしまいます。(特にエラー等は出ていません)

該当のソースコード

function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); //「確認結果」シートを代入 var sheetAnser = ss.getSheetByName('確認結果シート'); //「物品管理」シートを代入 var sheetKanri = ss.getSheetByName('物品管理シート'); //最終行を取得 var lastRow = sheetAnser.getLastRow(); //2列目、最終行のセルの値を取得。 var data = sheetAnser.getRange(lastRow, 2).getValue(); //今日の日付を代入 var date = new Date(); //物品管理シートの最初の行から最終行まで確認結果シートに記載された管理番号を検索し、一致する番号があると確認日付欄(24列目)に今日の日付を記入する for(var i=1;i<=lastRow;i++){ if(sheetKanri.getRange(i, 2).getValue()=== data){ sheetKanri.getRange(i, 24).setValue(date); } } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

確認結果シートの方の最終行を forループで使ってるからではないでしょうか?
物品管理シートの最終行を取得してそちらを使ってみてください。

投稿2020/11/19 00:33

sawa

総合スコア3002

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

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

kenn99

2020/12/20 14:33

遅くなり申し訳ございません。ご回答ありがとうございます。 確認結果シートの最終行に追加された値を物品管理シートの1行目からforで同じ管理番号がないかを繰り返して探す動作としたのですが、forではだめでしょうか?
sawa

2020/12/21 00:49

forで処理するのが間違ってるのではなくて、forの処理で使っている最終行 lastRow が、 sheetAnser(確認結果シート) の最終行を使ってるところが違ってませんか?という回答です。 for(var i=1;i<=lastRow;i++) で繰り返しても、確認結果シートの最終行までしか動かないので、例えば 物品管理シートが本当は100行あっても、確認結果シートが50行なら 50で終わっちゃうってことです。 なので、forで使う為の物品管理シートの最終行を取得して、それを使うfor文のコードにすれば良いです。
kenn99

2021/01/19 08:28

ご回答ありがとうございます。 確かにおっしゃる通りですね。。おそらくこれが原因かと思いますのでこれを修正したいと思います。
guest

0

javascript

1// 最終行を取るパターン 2const q305132 = () => { 3 const resultSheetName = '結果確認シート'; 4 const itemSheetName = '物品管理シート'; 5 const book = SpreadsheetApp.getActive(); 6 7 const needle = book.getSheetByName(resultSheetName).getDataRange().getValues().slice(-1)[1]; 8 const itemSheet = book.getSheetByName(itemSheetName); 9 fillIn(itemSheet,1,needle,23,new Date()); 10} 11 12// そういう操作は onEdit を使うべき 13const onEdit_305132 = (e) => { 14 const resultSheetName = '結果確認シート'; 15 const itemSheetName = '物品管理シート'; 16 if (!e.value) return; 17 const curRange = e.range; 18 const c = curRange().getColumn(); 19 if (c !== 2) return; 20 const sheet = curRange.getSheet(); 21 if (sheet.getName() !== resultSheetName) return; 22 fillIn(e.source.getSheetByName(itemSheetName),1,e.value,23,new Date()); 23} 24 25// 共通のヘルパ 26const fillIn = (sheet,pos,needle,posToSet,valueToSet) => { 27 sheet.getDataRange().getValues().map(e=> (e[pos] === needle?e.map((f,i)=> (i===posToSet?valueToSet:f)):e)); 28 sheet.getRange(1,1,dat.length,dat[0].length).setValues(dat); 29}

物品管理シートに重複があったらどうするのか、という点が気になりました(現状、全てに書き込むようですが)

投稿2020/11/20 15:15

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問