- 転記先スプレッドシート(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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー