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

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

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

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

277閲覧

GASのエラー表記(範囲の行数には 1 以上を指定してください)について

Angs

総合スコア1

Google Apps Script

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2025/01/14 08:41

編集2025/01/16 01:00

- 転記先スプレッドシート(SampleB,SampleCも同じレイアウト)
イメージ説明

イメージ説明

  • 転記元スプレッドシート↓

  • イメージ説明

  • 転記先スプレッドシート↓

イメージ説明

  • エディタでの実行結果↓

イメージ説明

-デバック結果
イメージ説明

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • エラーを解消して転記先のスプレッドシートに転記したい
  • シート名を検索して見つけているはずなに、なぜか見つかりませんとエラーメッセージが出てくる。

前提

  • 転記元のスプレッドシート画像の右上にプルダウンと送信ボタンがあると思いますが、プルダウンで実行したい関数を選び送信ボタンで実行する感じです。
  • 転記元スプレッドシートから特定の値を取得して、指定した転記先のスプレッドシート内の決められた値に転記したいです。
  • 転記できるスプレッドシートとできないスプレッドシートがありました。転記できるスプレッドシートを複製して試したがダメでした。

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

範囲の行数には 1 以上を指定してください

該当のソースコード

function onButtonClick() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const targetRow = 取得したい項目名が記載されている行; const word = "取得したい項目名A"; const lastColumn = sheet.getLastColumn(); const rowValues = sheet.getRange(targetRow, 1, 1, lastColumn).getValues()[0]; const columnIndex = rowValues.indexOf(word); if (columnIndex === -1) { SpreadsheetApp.getUi().alert(`値 "${word}" は行内に見つかりませんでした`); return; } const staffName = sheet.getRange("H4").getValue(); const ssidName = sheet.getRange("I4").getValue(); const dropdownCell = sheet.getRange("J4"); const selectedOption = dropdownCell.getValue(); const data = sheet.getRange(9, 1, sheet.getLastRow() - 8, sheet.getLastColumn()).getValues(); const targetRowIndex = data.findIndex(row => row[columnIndex] === ssidName); if (targetRowIndex === -1) { SpreadsheetApp.getUi().alert(`${ssidName} に一致する管理IDが見つかりませんでした`); return; } const relatedItems = ["取得したい項目名B"]; const relatedGrams = {}; relatedItems.forEach(item => { const itemIndex = rowValues.indexOf(item); if (itemIndex !== -1) { relatedGrams[item] = data[targetRowIndex][itemIndex]; } else { console.log(`${item} は見つかりませんでした`); } }); const targetSpreadsheets = [ '転記先スプレッドシートURLを記載A', '転記先スプレッドシートURLを記載B', '転記先スプレッドシートURLを記載C' ]; if (selectedOption === "追加/上書き") { processTransfer(targetSpreadsheets, staffName, ssidName, relatedGrams); } else if (selectedOption === "削除") { handleRecordOperation(targetSpreadsheets, staffName, ssidName); } else if (selectedOption === "終了") { processOption3(); } else { SpreadsheetApp.getUi().alert("有効なオプションが選ばれていません。"); } } //実装がうまくいかないところ↓ function processTransfer(targetSpreadsheets, staffName, ssidName, relatedGrams) { for (const spreadsheetId of targetSpreadsheets) { try { // const targetSheet = getTargetSheet(spreadsheetId, staffName); // スプレッドシートIDでスプレッドシートを開く const spreadsheet = SpreadsheetApp.openById(spreadsheetId); // シート一覧を取得 const sheets = spreadsheet.getSheets(); // 対象となるシートを取得するためにループ let targetSheet = null; for (let i = 0; i < sheets.length; i++) { if (sheets[i].getName() === staffName) { targetSheet = sheets[i]; break; // 対象シートを見つけたらループを抜ける } } // 対象シートが見つからない場合 if (!targetSheet) { throw new Error(`シート "${staffName}" が見つかりませんでした`); } // 各スプレッドシートIDに対して実行される処理 console.log(`処理中のシート名: ${staffName}`); console.log(`処理中のスプレッドシートID: ${spreadsheetId}`); // シートが見つからない場合はエラーを出力 if (!targetSheet) { console.log(`エラー: シート "${staffName}" が見つかりませんでした`); return; // シートが見つからなければ処理を中断 } // シートが見つかった場合の処理 console.log(`シート "${staffName}" が見つかりました`); const targetRow = 1; const dataStartRow = 2; const targetItems = targetSheet.getRange(targetRow, 1, 1, targetSheet.getLastColumn()).getValues()[0]; const missingItems = Object.keys(relatedGrams).filter(item => !targetItems.includes(item)); if (missingItems.length > 0) { SpreadsheetApp.getUi().alert(`次の項目が転記先に見つかりません: ${missingItems.join(", ")}`); return; } const referenceIndex = targetItems.indexOf("管理ID"); const targetData = targetSheet.getRange(dataStartRow, referenceIndex + 1, targetSheet.getLastRow() - dataStartRow + 1).getValues(); const targetRowIndex = targetData.findIndex(row => row[0] === ssidName); if (targetRowIndex === -1) { const newRowIndex = targetSheet.getLastRow() + 1; targetSheet.getRange(newRowIndex, referenceIndex + 1).setValue(ssidName); Object.entries(relatedGrams).forEach(([item, gram]) => { const itemIndex = targetItems.indexOf(item); if (itemIndex !== -1) { targetSheet.getRange(newRowIndex, itemIndex + 1).setValue(gram); } }); } else { Object.entries(relatedGrams).forEach(([item, gram]) => { const itemIndex = targetItems.indexOf(item); if (itemIndex !== -1) { targetSheet.getRange(dataStartRow + targetRowIndex, itemIndex + 1).setValue(gram); } }); } } catch (error) { SpreadsheetApp.getUi().alert(`転記中にエラーが発生しました: ${error.message}`); } } } //今は無視してください function handleRecordOperation(targetSpreadsheets, staffName, ssidName) { for (const spreadsheetId of targetSpreadsheets) { try { const targetSheet = getTargetSheet(spreadsheetId, staffName); if (!targetSheet) throw new Error(`シート "${staffName}" が見つかりませんでした`); const lastRow = targetSheet.getLastRow(); const columnValues = targetSheet.getRange(1, 1, lastRow, 1).getValues(); const existingRow = columnValues.findIndex(row => row[0] === ssidName); if (existingRow !== -1) { targetSheet.deleteRow(existingRow + 1); SpreadsheetApp.getUi().alert(`管理ID "${ssidName}" を削除しました。`); } else { SpreadsheetApp.getUi().alert(`該当するID "${ssidName}" は存在しませんでした。`); } } catch (error) { Logger.log(`エラー: ${error.message}`); } } } //今は無視してください function processOption3() { SpreadsheetApp.getUi().alert("担当者ステータスが更新されました。"); } //今は無視してください function getTargetSheet(spreadsheetId, sheetName) { const ss = SpreadsheetApp.openById(spreadsheetId); const sheets = ss.getSheets(); return sheets.find(sheet => sheet.getName() === sheetName); }

試したこと

  • console.logで(!targetSpreadsheet)などで見つけているかどうかの確認をしました。
  • リンク等の誤字脱字をチェックしました。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

YAmaGNZ

2025/01/14 11:01

そのエラーはどの行で出るのですか? そこで指定している値が何になっているかを確認しましたか?
Angs

2025/01/15 00:09

ご回答ありがとうございます。 エラーがどの行に出ているかについてですが、アラートやコンソールログでエラーメッセージが出るようにしたのですが、タイトルのエラーメッセージしか出てこないです。他にエラーの詳細内容が表示できるようにする記述があるのであればご教授いただければ幸いです。 宜しくお願い致します。
YAmaGNZ

2025/01/15 00:24

エディタ上で実行すれば実行ログに出てくると思うのですが出てきませんか? あとエラーメッセージからの想像でしかないのですがgetRangeを使用している箇所の行数部分が1未満になっているか確認してみてはどうでしょうか。 コードを実行してみましたがシートがどのようになっているか分からないので現象が再現できません。
Angs

2025/01/15 00:48

スプレッドシートの画像とエディタの実行画面結果をお送りしております。お手すきの際にご確認よろしくお願い致します。 >あとエラーメッセージからの想像でしかないのですがgetRangeを使用している箇所の行数部分が1未満になっているか確認してみてはどうでしょうか。 -こちらについては試させていただきます。ありがとうございます。
YAmaGNZ

2025/01/15 01:35

エディタからデバッグ実行したらエラー発生行で停止したりしませんかね? また発生しているエラーはどこかのtry~cahtchに引っかかったところでのalertメッセージで出ているんですかね? 提示していただいた実行ログですとLogger.logでの出力でのメッセージではなさそうなので targetSheet.getLastRow() - dataStartRow + 1の値が何になっているかなど確認してみてはどうでしょうか。
Angs

2025/01/15 01:48

デバック結果画像を表示しております。最初に紫色で表示されておりました。 >targetSheet.getLastRow() - dataStartRow + 1の値が何になっているかなど確認してみてはどうでしょうか。 -確認してみます。ありがとうございます。
Angs

2025/01/15 04:36

確認してみましたが問題はなさそうでした。他にどこ見せる必要のある個所はありますでしょうか?
YAmaGNZ

2025/01/15 05:08

targetSheetが見出し行のみ(提示されている転記先スプレッドシートの画像)の場合、 targetSheet.getLastRow()は1で 1-2+1となり計算結果が0になりませんか? そうなるとgetRangeで取得する行が0となりエラーとなるのではないかと思います。 このようなパターンだったりしませんかね?
Angs

2025/01/15 05:55

ありがとうございます。 ですが、今回3枚ほど転記先のスプレッドシート(同じレイアウト)を用意して1枚だけ動くには動いているんです。アラートでシート○○が見つかりませんでした。と出るんですが、指定の位置への転記はできてるんですよね。てことはエラーが起きているのはシート名やスプレッドシートのリンクの取得に問題あるんじゃないかなと思ったんですけど、どうでしょうか?
YAmaGNZ

2025/01/15 06:35

転記先のスプレッドシート全てに書き込み先のシート(シート○○)があるのでしょうか? もしその転記先のスプレッドシートのどれかにそのシート名のものがなかった場合 そのスプレッドシートの処理時にthrowが実行されます。 そこでcatch内部が実行されてアラート(シート○○が見つかりませんでした。)が表示されます。 そして次のスプレッドシートの処理となります。 もし // シートが見つからない場合はエラーを出力 if (!targetSheet) { console.log(`エラー: シート "${staffName}" が見つかりませんでした`); return; // シートが見つからなければ処理を中断 } こちらの処理にてこの関数が中断されるはずと考えていらっしゃるなら、この処理は実行されていないこととなります。 できるなら、デバッグ実行でステップ実行していってどのように動いているのか確認してみるといいかもしれません。
Angs

2025/01/15 06:57 編集

回答ありがとうございます(´;ω;`)ウッ…) >転記先のスプレッドシート全てに書き込み先のシート(シート○○)があるのでしょうか? -全てスプレッドシートにはシート名つけています。英語一文字で試したり、小文字だけの簡単な文字だけというのも試してみました。ですが、特定のスプレッドシート以外が処理されませんでした。 >できるなら、デバッグ実行でステップ実行していってどのように動いているのか確認してみるといいかもしれません。 -エラーで停止し、紫色で表示されたところをすべて画像で移しますので、少しお待ちください。
Angs

2025/01/15 07:26

追加でデバックした場合の紫で表示された部分をお送りいたします。急ぎで行ったため、被り等の不備があるかもしれません。お手数をおかけしますがご確認お願い致します。
YAmaGNZ

2025/01/15 08:36

画像がどういうときのどういった画像なのかこちらでは分かりません。 対象のスプレッドシート(サンプルA~C)全てに”SampleC”というシートが存在するのですか? for (let i = 0; i < sheets.length; i++) { if (sheets[i].getName() === staffName) { targetSheet = sheets[i]; break; // 対象シートを見つけたらループを抜ける } } の部分で Logger.log('比較対象:' + staffName); for (let i = 0; i < sheets.length; i++) { Logger.log(sheets[i].getName()); if (sheets[i].getName() === staffName) { targetSheet = sheets[i]; break; // 対象シートを見つけたらループを抜ける } } といった感じでログ出力して確認したらどのように表示されますか? またこの内容は「範囲の行数には 1 以上を指定してください」とはずれた内容になっていますが こちらのほうはどうなったのですか?
Angs

2025/01/15 08:49

頂いたコードで実行した結果を画像に追加しております。お手すうですがご確認よろしくお願い致します。 >対象のスプレッドシート(サンプルA~C)全てに”SampleC”というシートが存在するのですか? - それぞれSampleA,SampleB,SampleCとシート名を記載しております。 >またこの内容は「範囲の行数には 1 以上を指定してください」とはずれた内容になっていますが こちらのほうはどうなったのですか? - 話がずれてしまい申し訳ございません。こちらに関してはまだ改善されておりません。
Angs

2025/01/15 09:09

画像の管理IDが記載転記先のスプレッドシートの画像の管理IDについてですが、転記先に管理IDを記載した状態で転記元のbuttonclickを実行したら転記することができました。その時はアラートで”範囲の行数には 1 以上を指定してください”と表示はされませんでした。一つもやもや解消されました。ありがとうございます。 ですが、転記先に管理IDが記載されていない状態で追加しようとすると今までと同じようなエラーが出てしまいます。 targetSheet.getLastRow()あたりの行列の値の取得の記述が問題なんでしょうか?
YAmaGNZ

2025/01/15 09:14

> ですが、転記先に管理IDが記載されていない状態で追加しようとすると今までと同じようなエラーが出てしまいます。 > targetSheet.getLastRow()あたりの行列の値の取得の記述が問題なんでしょうか? 以前にコメントした >targetSheet.getLastRow()は1で >1-2+1となり計算結果が0になりませんか? といったことになっていませんか?
YAmaGNZ

2025/01/15 09:25

>頂いたコードで実行した結果を画像に追加しております。 こちらの結果が出たときは「シート”SampleA”が見つかりませんでした。」とアラートが出たのでしょうか? 2つ目、3つ目のスプレッドシートにはSampleAというシートがあるように見えないのですが実際どのようになっていますか? ログを見る限り 1つ目のスプレッドシート:SampleAというシート 2つ目のスプレッドシート:SampleBというシート 3つ目のスプレッドシート:SampleCというシート といった構成に見えます。 転記先のスプレッドシートそれぞれにどのようなシートが存在するか画像を載せることは可能でしょうか。
Angs

2025/01/16 00:59

>こちらの結果が出たときは「シート”SampleA”が見つかりませんでした。」とアラートが出たのでしょうか? 2つ目、3つ目のスプレッドシートにはSampleAというシートがあるように見えないのですが実際どのようになっていますか? - アラートにはこのように表示されました。各転記先シートを指定した状態で新規追加の実行を行った場合に出てくるアラートです。転記先のスプレッドシートには画像と同じ1行目に項目のみでそれからしたは空の状態。各スプレッドシート上から順にアラートが出てきました。 SampleAシート 1転記中にエラーが発生しました: 範囲の行数には 1 以上を指定してください。 2転記中にエラーが発生しました: 範囲の行数には 1 以上を指定してください。 3転記中にエラーが発生しました: 範囲の行数には 1 以上を指定してください。 SampleBシート 1転記中にエラーが発生しました: targetSheet is not defined 2転記中にエラーが発生しました: 範囲の行数には 1 以上を指定してください。 3転記中にエラーが発生しました: 範囲の行数には 1 以上を指定してください。 SampleCシート 1転記中にエラーが発生しました: targetSheet is not defined 2転記中にエラーが発生しました: targetSheet is not defined 3転記中にエラーが発生しました: 範囲の行数には 1 以上を指定してください。 >転記先のスプレッドシートそれぞれにどのようなシートが存在するか画像を載せることは可能でしょうか。 - 転記先のスプレッドシートには一枚のシートしかありません。画像にてSampleAのスプレッドシートの画像をお送りしております。転記先のシートはすべてこのような感じなります。 >>targetSheet.getLastRow()は1で >>1-2+1となり計算結果が0になりませんか? といったことになっていませんか? - なっているかもしれません。確認してみます。
YAmaGNZ

2025/01/16 02:16

「範囲の行数には 1 以上を指定してください」の件は置いておいて processTransfer関数を1回実行したら処理は以下のようになっています。(staffNameがSampleAの場合) 1.SampleAのスプレッドシートを開く 2.シート一覧を取得する 3.シート一覧から対象(SampleA)を探す 4.SampleAが見つかった 5.処理する 6.SampleBのスプレッドシートを開く 7.シート一覧を取得する 8.シート一覧から対象(SampleA)を探す 9.SampleAが見つからない 10.throw new Error(`シート "${staffName}" が見つかりませんでした`);が実行される 11.catch 句まで飛ぶ 12.SpreadsheetApp.getUi().alert(`転記中にエラーが発生しました: ${error.message}`)の処理でアラートが表示される 13.SampleCのスプレッドシートを開く 14.シート一覧を取得する 15.シート一覧から対象(SampleA)を探す 16.SampleAが見つからない 17.throw new Error(`シート "${staffName}" が見つかりませんでした`);が実行される 18.catch 句まで飛ぶ 19.SpreadsheetApp.getUi().alert(`転記中にエラーが発生しました: ${error.message}`)の処理でアラートが表示される まず上記の処理が思っている処理になっていますか?
Angs

2025/01/16 02:40

function onButtonClick() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const targetRow = 8; const word = "管理ID"; const lastColumn = sheet.getLastColumn(); const rowValues = sheet.getRange(targetRow, 1, 1, lastColumn).getValues()[0]; const columnIndex = rowValues.indexOf(word); if (columnIndex === -1) { SpreadsheetApp.getUi().alert(`値 "${word}" は行内に見つかりませんでした`); return; } const staffName = sheet.getRange("H4").getValue(); const ssidName = sheet.getRange("I4").getValue(); const dropdownCell = sheet.getRange("J4"); const selectedOption = dropdownCell.getValue(); const data = sheet.getRange(9, 1, Math.max(sheet.getLastRow() - 8, 0), sheet.getLastColumn()).getValues(); const targetRowIndex = data.findIndex(row => row[columnIndex] === ssidName); if (targetRowIndex === -1) { SpreadsheetApp.getUi().alert(`${ssidName} に一致する管理IDが見つかりませんでした`); return; } const relatedItems = ["タスク", "校正期限"]; const relatedGrams = {}; relatedItems.forEach(item => { const itemIndex = rowValues.indexOf(item); if (itemIndex !== -1) { relatedGrams[item] = data[targetRowIndex][itemIndex]; } else { console.log(`${item} は見つかりませんでした`); } }); const targetSpreadsheets = [ '1No2dfNz147Vpt7REuWRpCPj1V7-ZcVWtOke55Qsvuaw', '1QHMoAuaaXEs2KeiLNfZ1UwuCNVgJ-5Xb3pIgtmFQYdY', '1_8mzago7ODUkTClItfuzpACbEP7tBPMBF06iIdwz5nA' ]; if (selectedOption === "追加/上書き") { processTransfer(targetSpreadsheets, staffName, ssidName, relatedGrams); } else if (selectedOption === "削除") { handleRecordOperation(targetSpreadsheets, staffName, ssidName); } else if (selectedOption === "終了") { processOption3(); } else { SpreadsheetApp.getUi().alert("有効なオプションが選ばれていません。"); } } function processTransfer(targetSpreadsheets, staffName, ssidName, relatedGrams) { for (const spreadsheetId of targetSpreadsheets) { try { const spreadsheet = SpreadsheetApp.openById(spreadsheetId); const sheets = spreadsheet.getSheets(); let targetSheet = null; Logger.log('比較対象:' + staffName); for (let i = 0; i < sheets.length; i++) { Logger.log(sheets[i].getName()); if (sheets[i].getName() === staffName) { targetSheet = sheets[i]; break; } } if (!targetSheet) { throw new Error(`シート "${staffName}" が見つかりませんでした`); } const targetRow = 1; const dataStartRow = 2; const lastRow = targetSheet.getLastRow(); const rowCount = Math.max(lastRow - dataStartRow + 1, 0); const targetItems = targetSheet.getRange(targetRow, 1, 1, targetSheet.getLastColumn()).getValues()[0]; const missingItems = Object.keys(relatedGrams).filter(item => !targetItems.includes(item)); if (missingItems.length > 0) { SpreadsheetApp.getUi().alert(`次の項目が転記先に見つかりません: ${missingItems.join(", ")}`); return; } const referenceIndex = targetItems.indexOf("管理ID"); const targetData = rowCount > 0 ? targetSheet.getRange(dataStartRow, referenceIndex + 1, rowCount).getValues() : []; const targetRowIndex = targetData.findIndex(row => row[0] === ssidName); if (targetRowIndex === -1) { const newRowIndex = lastRow + 1; targetSheet.getRange(newRowIndex, referenceIndex + 1).setValue(ssidName); Object.entries(relatedGrams).forEach(([item, gram]) => { const itemIndex = targetItems.indexOf(item); if (itemIndex !== -1) { targetSheet.getRange(newRowIndex, itemIndex + 1).setValue(gram); } }); } else { Object.entries(relatedGrams).forEach(([item, gram]) => { const itemIndex = targetItems.indexOf(item); if (itemIndex !== -1) { targetSheet.getRange(dataStartRow + targetRowIndex, itemIndex + 1).setValue(gram); } }); } } catch (error) { SpreadsheetApp.getUi().alert(`転記中にエラーが発生しました: ${error.message}`); } } }
Angs

2025/01/16 02:46

いただいたご質問の内容と違うんですが、追加、上書きの処理ができました。 修正コードは上記に添付しております。 >>targetSheet.getLastRow()は1で >>1-2+1となり計算結果が0になりませんか? といったことになっていませんか? こちらについてですが、やはり0になりエラーが起こっていました。修正したら処理としては上書き、追加どちらも機能はしました。ご指摘いただきありがとうございます。 ですが、throw new Errorで指定のシートが見つかりませんとエラーが出てしまいます。 先ほど頂いた処理がこのようにできているかの質問に関してはこれからチェックしてお答えしますので、よろしくお願い致します。
Angs

2025/01/16 03:40

>ですが、throw new Errorで指定のシートが見つかりませんとエラーが出てしまいます。 先ほど頂いた処理がこのようにできているかの質問に関してはこれからチェックしてお答えしますので、よろしくお願い致します。 シートを探すループ処理についてですが、下記の〇ソースコードを記述し実行すると下記の〇実行ログのようになりました。 〇実行ログ 12:25:09 情報 シート名:~の所で違うシート名も取得していたので、throw new Errorが出てきたんじゃないかと思います。今回はシートを3つ用意していたので、2回アラートでエラーメッセージが出てきました。 〇ソースコード Logger.log('比較対象: ' + staffName); // staffNameの値を確認 for (let i = 0; i < sheets.length; i++) { Logger.log('シート名: ' + sheets[i].getName()); // 各シート名を確認 if (sheets[i].getName() === staffName) { Logger.log('一致したシート名: ' + sheets[i].getName()); // 一致した場合にログを出力 targetSheet = sheets[i]; break; } } if (!targetSheet) { Logger.log('targetSheetが見つかりませんでした'); } else { Logger.log('targetSheetが見つかりました: ' + targetSheet.getName()); } 〇実行ログ 12:24:28 お知らせ 実行開始 12:25:09 情報 比較対象: SampleB 12:25:09 情報 シート名: SampleA 12:25:09 情報 targetSheetが見つかりませんでした 12:25:23 情報 比較対象: SampleB 12:25:23 情報 シート名: SampleB 12:25:23 情報 一致したシート名: SampleB 12:25:23 情報 targetSheetが見つかりました: SampleB 12:25:23 情報 比較対象: SampleB 12:25:23 情報 シート名: SampleC 12:25:23 情報 targetSheetが見つかりませんでした 12:24:47 お知らせ 実行完了
YAmaGNZ

2025/01/16 03:50

1つ目のシートに対象シート名が存在しないからアラートを表示する。 2つ目のシートに対象シート名が存在するから転記処理を行う。 3つ目のシートに対象シート名が存在しないからアラートを表示する。 上記の動作はプログラム通りの動きです。 実際に実現したい動作は 3つのシートのうち1つでも正常な処理(転記処理)を行ったらアラートは出さない。 3つのシート全てで対象シート名のシートが存在しない(転記処理を行わなかった)場合はアラートを表示する。 という内容だったりしますか?
Angs

2025/01/16 04:08

>実際に実現したい動作は >3つのシートのうち1つでも正常な処理(転記処理)を行ったらアラートは出さない。 >3つのシート全てで対象シート名のシートが存在しない(転記処理を行わなかった)場合はアラートを>表示する。 >という内容だったりしますか? 処理のエラーを探す場合は上記のような内容にしたいです。ですが、実装する場合は3つのシートのうち1つでも正常な処理(転記処理)を行ったらアラート出す。(例:SampleBに転記しました。)という処理を行いたいです。
YAmaGNZ

2025/01/16 04:26

対象スプレッドシート全てを処理した結果を出したいのであればループ内でアラート表示をするのではなく 正常だったスプレッドシート、NGだったスプレッドシートを配列等に格納するだけにして ループが終わった後にその配列に格納されている数で判断してアラート処理をするなどすればいいのではないでしょうか。 let OKSheets = [] let NGSheets = [] for (const spreadsheetId of targetSpreadsheets) { try { // 処理 OKSheets.push(targetSheet.getName()); } catch { NGSheets.push(targetSheet.getName()); } } if(OKSheets.length > 0) { // OKシートがあるので正常終了アラート表示 } else { // OKシートがないので異常終了アラート表示 } } とか 異常が複数の異常があった場合等を考慮しないといけないかとは思いますが・・・
Angs

2025/01/17 01:17

ありがとうございます。 エラーやアラートのなどの問題が解決できました。親身になってご意見、ご提案頂き本当にありがとうございました。助かりました。
YAmaGNZ

2025/01/17 01:20

解決おめでとうございます! 解決方法をまとめて、「自己解決」として回答してください! 同じように困っている人の貴重な情報になると思います。
Angs

2025/01/17 01:25

本当にありがとうございました。自己解決済みにし、修正版のソースコードを記載しております。またご機会がございましたら宜しくお願い致します。
guest

回答1

0

自己解決

解決済みのソースコードです。

GAS

1function onButtonClick() { 2 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 3 4 const targetRow = 8; 5 const managementIdKeyword = "管理ID"; // より明確な名前に変更 6 const lastColumn = sheet.getLastColumn(); 7 const rowValues = sheet.getRange(targetRow, 1, 1, lastColumn).getValues()[0]; 8 const columnIndex = rowValues.indexOf(managementIdKeyword); 9 10 if (columnIndex === -1) { 11 SpreadsheetApp.getUi().alert(`値 "${managementIdKeyword}" は行内に見つかりませんでした`); 12 return; 13 } 14 15 const staffName = sheet.getRange("H4").getValue(); 16 const ssidName = sheet.getRange("I4").getValue(); 17 const dropdownCell = sheet.getRange("J4"); 18 const selectedOption = dropdownCell.getValue(); 19 20 const data = sheet.getRange(9, 1, Math.max(sheet.getLastRow() - 8, 0), sheet.getLastColumn()).getValues(); 21 const targetRowIndex = data.findIndex(row => row[columnIndex] === ssidName); 22 23 if (targetRowIndex === -1) { 24 SpreadsheetApp.getUi().alert(`${ssidName} に一致する管理IDが見つかりませんでした`); 25 return; 26 } 27 28 const relatedItems = ["タスク", "校正期限", "担当LD", "ステータス", "概要"]; 29 const relatedGrams = {}; 30 31 relatedItems.forEach(item => { 32 const itemIndex = rowValues.indexOf(item); 33 if (itemIndex !== -1) { 34 relatedGrams[item] = data[targetRowIndex][itemIndex]; 35 } else { 36 console.log(`${item} は見つかりませんでした`); 37 } 38 }); 39 40 const targetSpreadsheets = [ 41 '1No2dfNz147Vpt7REuWRpCPj1V7-ZcVWtOke55Qsvuaw', 42 '1QHMoAuaaXEs2KeiLNfZ1UwuCNVgJ-5Xb3pIgtmFQYdY', 43 '1_8mzago7ODUkTClItfuzpACbEP7tBPMBF06iIdwz5nA' 44 ]; 45 46 if (selectedOption === "追加/上書き") { 47 processTransfer(targetSpreadsheets, staffName, ssidName, relatedGrams); 48 } else if (selectedOption === "削除") { 49 handleRecordOperation(targetSpreadsheets, staffName, ssidName, relatedGrams); 50 } else if (selectedOption === "終了") { 51 processOption3(); 52 } else { 53 SpreadsheetApp.getUi().alert("有効なオプションが選ばれていません。"); 54 } 55} 56 57//============================= 58//追加、上書き 59//============================= 60 61function processTransfer(targetSpreadsheets, staffName, ssidName, relatedGrams) { 62 let transferCompleted = false; // 転記が行われたかどうかを判定するフラグ 63 64 for (const spreadsheetId of targetSpreadsheets) { 65 try { 66 const spreadsheet = SpreadsheetApp.openById(spreadsheetId); 67 const sheets = spreadsheet.getSheets(); 68 69 // シートを探す 70 const targetSheet = sheets.find(sheet => sheet.getName() === staffName); 71 72 if (!targetSheet) { 73 Logger.log(`シート "${staffName}" がスプレッドシート "${spreadsheet.getName()}" に見つかりませんでした`); 74 continue; // 次のスプレッドシートに進む 75 } 76 77 const targetRow = 1; 78 const dataStartRow = 2; 79 const lastRow = targetSheet.getLastRow(); 80 const rowCount = Math.max(lastRow - dataStartRow + 1, 0); 81 82 const targetItems = targetSheet.getRange(targetRow, 1, 1, targetSheet.getLastColumn()).getValues()[0]; 83 const missingItems = Object.keys(relatedGrams).filter(item => !targetItems.includes(item)); 84 85 if (missingItems.length > 0) { 86 continue; // 次のスプレッドシートに進む 87 } 88 89 const managementIdColumnIndex = targetItems.indexOf("管理ID"); 90 const targetData = rowCount > 0 91 ? targetSheet.getRange(dataStartRow, managementIdColumnIndex + 1, rowCount).getValues() 92 : []; 93 94 const targetRowIndex = targetData.findIndex(row => row[0] === ssidName); 95 96 if (targetRowIndex === -1) { 97 const newRowIndex = lastRow + 1; 98 targetSheet.getRange(newRowIndex, managementIdColumnIndex + 1).setValue(ssidName); 99 100 Object.entries(relatedGrams).forEach(([item, gram]) => { 101 const itemIndex = targetItems.indexOf(item); 102 if (itemIndex !== -1) { 103 targetSheet.getRange(newRowIndex, itemIndex + 1).setValue(gram); 104 } 105 }); 106 } else { 107 Object.entries(relatedGrams).forEach(([item, gram]) => { 108 const itemIndex = targetItems.indexOf(item); 109 if (itemIndex !== -1) { 110 targetSheet.getRange(dataStartRow + targetRowIndex, itemIndex + 1).setValue(gram); 111 } 112 }); 113 } 114 115 transferCompleted = true; // 転記が行われた場合、フラグを更新 116 117 } catch (error) { 118 SpreadsheetApp.getUi().alert(`転記中にエラーが発生しました: ${error.message}`); 119 } 120 } 121 122 // 転記が完了した場合に通知を表示 123 if (transferCompleted) { 124 SpreadsheetApp.getUi().alert("転記が完了しました!"); 125 } 126} 127 128 129//============================= 130//削除 131//============================= 132 133function handleRecordOperation(targetSpreadsheets, staffName, ssidName, relatedGrams) { 134 for (const spreadsheetId of targetSpreadsheets) { 135 try { 136 const spreadsheet = SpreadsheetApp.openById(spreadsheetId); 137 const sheets = spreadsheet.getSheets(); 138 const ui = SpreadsheetApp.getUi(); 139 140 // targetSheet を Array.find を使って簡潔に取得 141 const targetSheet = sheets.find(sheet => sheet.getName() === staffName); 142 143 if (!targetSheet) { 144 Logger.log(`シート "${staffName}" がスプレッドシート "${spreadsheet.getName()}" に見つかりませんでした`); 145 continue; // 次のスプレッドシートに進む 146 } 147 148 const targetRow = 1; 149 const dataStartRow = 2; 150 const lastRow = targetSheet.getLastRow(); 151 const rowCount = Math.max(lastRow - dataStartRow + 1, 0); 152 153 const targetItems = targetSheet.getRange(targetRow, 1, 1, targetSheet.getLastColumn()).getValues()[0]; 154 const managementIdColumnIndex = targetItems.indexOf("管理ID"); 155 const targetData = rowCount > 0 156 ? targetSheet.getRange(dataStartRow, managementIdColumnIndex + 1, rowCount).getValues() 157 : []; 158 159 const targetRowIndex = targetData.findIndex(row => row[0] === ssidName); 160 161 if (targetRowIndex !== -1) { 162 const actualRowIndex = targetRowIndex + dataStartRow; 163 targetSheet.deleteRow(actualRowIndex); 164 ui.alert(`管理ID "${ssidName}" を削除しました。`); 165 } else { 166 ui.alert(`管理ID "${ssidName}" は見つかりませんでした。`); 167 } 168 169 } catch (error) { 170 SpreadsheetApp.getUi().alert(`転記中にエラーが発生しました: ${error.message}`); 171 } 172 } 173} 174

投稿2025/01/17 01:24

Angs

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問