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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

1回答

248閲覧

【GAS】vlookupの動作をGASで作成したが対応した値が入力されない

kunimasa

総合スコア5

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

3クリップ

投稿2023/05/25 04:59

実現したいこと

お世話になります。
「A」と「B」の2シートがあるスプレッドシートにて、
「A」シートの項目「ID」列に他アプリから連携された値(ID)が自動入力されると、
そのIDに対応した氏名が「A」シートの項目「user」列に自動入力される。
という動作を想定したGASを作成しました。

なお、IDに対応した氏名が記載されているシートは「B」で、
「B」シートは、A列が「ID」、B列が「name」というシートです。(1行目に項目名無し)
「B」シートの行は、今後増減がある予定です。

前提

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

「A」シートの項目「ID」列に他アプリから連携された値(ID)が自動入力されると
IDに対応した氏名が「A」シートの項目「user」列に自動入力されません。
但し、私が「ID」列にIDを手入力すると、そのIDに対応した氏名が自動入力されます。

エラーは発生しません。

問題点がございましたらご教示いただけますと幸いです。
宜しくお願い致します。

該当のソースコード

function onEdit(e) {
var sheet = e.source.getActiveSheet();
var range = e.range;

// 「A」シートの変更のみを処理する
if (sheet.getName() == "A") {
var column = range.getColumn();
var row = range.getRow();

// 「ID」の列(列番号で判断)のみを処理する if (column == 9) { var ID = range.getValue(); var userSheet = e.source.getSheetByName("B"); var userRange = userSheet.getDataRange(); var values = userRange.getValues(); // 「B」シートからIDに対応する氏名を検索 for (var i = 1; i < values.length; i++) { if (values[i][0] == ID) { sheet.getRange(row, 10).setValue(values[i][1]); break; } } }

}
}

試したこと

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

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

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

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

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

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

YellowGreen

2023/05/25 05:41 編集

onEdit関数は、ユーザーがスプレッドシートの値を変更すると実行されます。 スクリプトの実行結果などで値が変更されてもonEditのトリガーとなるイベントが発生したとは認識されません。 「他のアプリからの連携による値の自動入力」がonEditを実行するトリガーになっていないと思われます。 「他のアプリ」がスプレッドシートやフォームを処理するGASスクリプトであれば、その「他のアプリ」がスプレッドシートに自動入力する際に、併せてIDに対応した氏名の入力の処理も行うように「他のアプリ」の方を修正することはできまませんか?
YellowGreen

2023/05/25 06:12 編集

例えば、こんなことができます。 //こちらが自動入力のスクリプトだとします。 function myFunction() { const ss = SpreadsheetApp.getActive(); const sheet = ss.getActiveSheet(); const range = sheet.getRange('A1'); const value = 'X'; const oldValue = range.getValue(); range.setValue(value); const e = {}; e.source = ss; e.range = range; e.value = value; e.oldValue = oldValue; sameOnEdit(e); } //こちらはonEditに代わるスクリプトです。 function sameOnEdit(e) { console.log(e.source.getName()); console.log(e.range.getA1Notation()); console.log(e.source.getActiveSheet().getName());//多分ここは左端のシートなので実際に記入したシートをe.sheetなどで渡すか、e.range.getSheet().getName()とする必要があると思います。 console.log(e.value); console.log(e.oldValue); }
kunimasa

2023/05/25 06:18

YellowGreen様 お世話になります。 早速のご回答ありがとうございます。 >>スクリプトの実行結果などで値が変更されてもonEditのトリガーとなるイベントが発生したとは認識されません。 こちら認識不足でした・・。申し訳ございません。 「他のアプリ」(GASではない)が修正不可ですので、どうしてもスプレッドシートで 処理せざるを得ないのです。。
kunimasa

2023/05/25 06:25

YellowGreen様 度々のコメントありがとうございます。 イメージで言うと、シートを「転記」するという事でしょうか。 一度教えていただいたスクリプト例を参考に、再作成してみたいと思います。
YellowGreen

2023/05/25 06:25

自動入力があった際に即時に反映されなくてもよければ 時間主導型のトリガーで分ベースのタイマーを10分おき(最低1分おき)等に設定しておき、 時間主導型のトリガーで起動するスクリプトで ID列に値があってuser列が空白になっている行を検索して 値を記入していくようにするなどでしょうか。
YellowGreen

2023/05/25 06:27

2023/05/25 15:25のコメントへの返信です。 「他のアプリ」を修正可能であることが前提のスクリプトの例ですので参考にならないと思います。 上の時間手動型のトリガーをご検討いただいた方がよろしいかと思います。
kunimasa

2023/05/25 06:30

YellowGreen様 ご丁寧にありがとうございます。 本当は即時更新が理想なのですが、おっしゃるようにタイマーで実行させるしか無さそうですね。 そのように改修する事に致します。 長い事お付き合いいただきありがとうございました。
YellowGreen

2023/05/25 07:10

参考までに時間主導型で実行するスクリプトの例です。 function checkID() { const ss = SpreadsheetApp.getActive(); const sheet = ss.getSheetByName('シート1'); const userSheet = ss.getSheetByName('シート2'); //シートの全てのデータを取得 const values = sheet.getDataRange().getValues(); //IDのみの配列を取得 const users = userSheet.getRange(1, 1, userSheet.getLastRow(), 1).getValues().flat(); //9列目が記入済みで10列目が未記入の行(i + 1)にuserSheetの同じIDの行(ix + 1)の2列目の値を記入する values.forEach((v, i) => { if (v[8] != '' && v[9] == '') { const ix = users.indexOf(v[8]); if (ix >= 0) { sheet.getRange(i + 1, 10).setValue(userSheet.getRange(ix + 1, 2).getValue()); } } }); }
kunimasa

2023/05/25 07:18

YellowGreen様 ご丁寧にありがとうございます。 一応時間主導型のスクリプトも作成してみましたが、YellowGreen様の構文の方がシンプルですので 参考にさせていただきたいと思います。 最後までありがとうございました!!
guest

回答1

0

自己解決

タイマーでスクリプト実行

投稿2023/05/25 06:34

kunimasa

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問