Google App Script:仅复制带复选框的行至目标工作表及代码仅打印日志无法写入目标区域的问题排查
Fix: Copy Checked Rows from Source to Destination in Google Apps Script
Great job on identifying the checked rows with your Logger output—you’re just missing a couple key steps to actually write those rows to your Destination sheet! Let’s break down what’s off in your current code and fix it:
What’s Not Working
Your script loops through the rows and logs the checked ones, but:
- You aren’t collecting the matching rows into an array to write later
- The
drangeyou defined only targets a single cell (dlr+1,1), so even if you tried to write, you’d only populate one cell instead of full rows - You never call a method to actually write the data to the sheet
Corrected Script
function insertrow(){ var spreadsheet = SpreadsheetApp.getActive(); var sourceSheet = spreadsheet.getSheetByName("Source"); var destSheet = spreadsheet.getSheetByName("Destination"); // Get all rows from Source (starting at row 2, column 2, with 2 columns total) var lastRow = sourceSheet.getLastRow(); var sourceData = sourceSheet.getRange(2, 2, lastRow - 1, 2).getValues(); // Adjusted row count to skip header row // Collect only rows where the first column (checkbox) is checked var rowsToCopy = []; sourceData.forEach(function(row){ if(row[0]){ // Check if checkbox (row[0] in the selected range) is checked rowsToCopy.push(row); // Add the full row to our collection array } }); // Write the collected rows to Destination sheet if(rowsToCopy.length > 0){ // Only write if there are rows to copy var destLastRow = destSheet.getLastRow(); // Define target range: matches the size of our collected rows var destRange = destSheet.getRange(destLastRow + 1, 1, rowsToCopy.length, rowsToCopy[0].length); destRange.setValues(rowsToCopy); // Write all collected rows in one go (efficient!) } else { Logger.log("No checked rows to copy!"); } }
Key Changes Explained
- Collected rows into
rowsToCopyarray: Instead of just logging, we store each checked row so we can write them all at once (way more efficient than writing row-by-row) - Adjusted source range row count:
lastRow - 1accounts for starting at row 2, so we don’t include an extra empty row if your sheet has a header - Dynamic target range: The destination range is sized to match the number of rows and columns in
rowsToCopy, so all data fits perfectly - Added empty collection check: Prevents errors if there are no checked rows to copy
- Renamed variables for clarity:
full→sourceSheet,shed→destSheetmakes the code easier to follow later
Bonus Tip
If you want to clear checkboxes after copying (to avoid re-copying the same rows), add this line right after destRange.setValues(rowsToCopy);:
// Reset checkboxes in Source sheet (column B, rows 2 to lastRow) sourceSheet.getRange(2, 2, lastRow - 1, 1).setValue(false);
内容的提问来源于stack exchange,提问作者DME SAINIK SPRINGS
相关产品推荐
相关产品推荐

