如何编写Script将动态变化单元格区域复制到固定目标位置
动态固定尺寸区域复制脚本方案
已知固定规则
- 所有源区域统一尺寸:5列 × 43行
- 复制目标位置固定:
Shop!A80 - 源区域全部位于
Jobsheet工作表,从给出的示例(B2:F44、L2:P44)可确认源区域起始行固定为第2行,仅起始列动态变化。
方案1:手动指定源起始列(适配多源区域切换场景)
每次复制前仅需修改1个列号参数,即可切换待复制的源区域,稳定性最高。
Google Apps Script 版本
function copyDynamicRange() { // 修改此处列号即可切换源区域:B列填2,L列填12,以此类推 const sourceStartCol = 2; const sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jobsheet"); const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Shop"); // 定位固定尺寸的源区域 const sourceRange = sourceSheet.getRange(2, sourceStartCol, 43, 5); // 复制到固定目标位置,保留格式、公式、数据验证 sourceRange.copyTo(targetSheet.getRange("A80")); // 若仅需复制纯值,注释上面的copyTo行,改用下面两行代码,执行速度更快 // const sourceValues = sourceRange.getValues(); // targetSheet.getRange("A80").offset(0, 0, 43, 5).setValues(sourceValues); }
Excel VBA 版本
Sub CopyDynamicRange() ' 修改此处列号即可切换源区域:B列填2,L列填12,以此类推 Const sourceStartCol As Integer = 2 Dim sourceSheet As Worksheet, targetSheet As Worksheet Set sourceSheet = ThisWorkbook.Worksheets("Jobsheet") Set targetSheet = ThisWorkbook.Worksheets("Shop") Dim sourceRange As Range Set sourceRange = sourceSheet.Cells(2, sourceStartCol).Resize(43, 5) ' 复制内容和格式到固定目标 sourceRange.Copy targetSheet.Range("A80") ' 若仅需复制纯值,注释上面的Copy行,改用下面代码 ' targetSheet.Range("A80").Resize(43, 5).Value = sourceRange.Value End Sub
方案2:自动识别有效源区域(无需手动改参数)
如果每次执行复制时,Jobsheet中仅有一个符合尺寸要求的有效数据块,可以用脚本自动定位源区域,无需手动修改参数:
function autoCopyDetectedRange() { const sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jobsheet"); const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Shop"); const maxCol = sourceSheet.getDataRange().getLastColumn(); // 从左到右遍历列,定位第一个符合尺寸的非空源区域 for (let col = 1; col <= maxCol; col++) { const checkRange = sourceSheet.getRange(2, col, 43, 5); // 判断规则:源区域左上角单元格非空即判定为目标区域,可根据实际业务调整判断逻辑 if (checkRange.getCell(1,1).getValue() !== "") { checkRange.copyTo(targetSheet.getRange("A80")); break; } } }
内容的提问来源于stack exchange,提问作者Ben C
相关产品推荐
相关产品推荐

