如何将ActiveSheet替换为指定工作表与列?能否同时指定工作表和选中范围?
解决你的Google Sheets随机排序问题
首先,你提到的var sheet = SpreadsheetApp.getActiveSheet(MY SPECIFIC SHEET);和var range = sheet.getActiveRange(MY SPECIFIC ROW);写法不符合Google Apps Script的API规范,我来帮你修正并实现两种你可能需要的场景:
场景1:指定特定工作表,使用用户手动选中的范围进行随机排序
这种场景下,用户先在目标工作表选中要排序的区域,然后点击菜单执行脚本,脚本会对选中的区域(限定在你指定的工作表内)进行随机排序:
function shuffleSelectedRows() { // 指定你要操作的工作表名称 const targetSheetName = "Ark5"; const ss = SpreadsheetApp.getActiveSpreadsheet(); const targetSheet = ss.getSheetByName(targetSheetName); const activeRange = ss.getActiveRange(); // 检查选中的范围是否在指定的工作表内 if (activeRange.getSheet().getName() !== targetSheetName) { SpreadsheetApp.getUi().alert(`请在「${targetSheetName}」工作表内选择范围!`); return; } // 获取选中范围的数值 const values = activeRange.getValues(); // Fisher-Yates洗牌算法(比你原来的随机排序更公平) for (let i = values.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [values[i], values[j]] = [values[j], values[i]]; } // 将打乱后的数值写回原范围 activeRange.setValues(values); } function onOpen() { const sheet = SpreadsheetApp.getActiveSpreadsheet(); const entries = [{ name : "Bland alle dyrene(选中区域随机排序)", functionName : "shuffleSelectedRows", }]; sheet.addMenu("Bland alle dyrene", entries); };
说明:这里用了更可靠的Fisher-Yates洗牌算法,避免原代码中sort方法随机排序的不公平问题;同时增加了范围校验,防止用户在其他工作表选中区域执行脚本出错。
场景2:固定指定工作表和特定范围(比如指定某列/某行)进行随机排序
如果你想每次都固定操作某个特定范围(比如原代码中的I2:I8),可以保留指定范围的写法,同时确保操作的是目标工作表:
function shuffleFixedRange() { // 指定目标工作表和固定范围 const targetSheetName = "Ark5"; const targetRangeAddress = "I2:I8"; const ss = SpreadsheetApp.getActiveSpreadsheet(); const targetSheet = ss.getSheetByName(targetSheetName); const targetRange = targetSheet.getRange(targetRangeAddress); // 获取范围数值并洗牌 const values = targetRange.getValues(); for (let i = values.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [values[i], values[j]] = [values[j], values[i]]; } // 写回打乱后的数值 targetRange.setValues(values); } function onOpen() { const sheet = SpreadsheetApp.getActiveSpreadsheet(); const entries = [ { name : "Bland alle dyrene(固定范围排序)", functionName : "shuffleFixedRange", }, { name : "Bland alle dyrene(选中区域排序)", functionName : "shuffleSelectedRows", } ]; sheet.addMenu("Bland alle dyrene", entries); };
说明:这种写法可以同时固定工作表和范围,不需要用户手动选中,点击菜单就直接对指定区域排序;你可以根据需要修改targetSheetName和targetRangeAddress的值。
关于原代码的错误修正
你的原代码里有几个明显的问题:
sheet.sort(function(a,b){return Math.floor(Math.random()*range)-Math.floor(Math.random()*range); });:sort方法不能直接这样用在Sheet对象上,而且range是Range对象,不能直接参与乘法运算,应该先获取范围的数值数组再排序。rg.setValues(sheet);:setValues需要传入二维数组,而sheet是Sheet对象,这里逻辑错误,应该传入打乱后的数值数组。
内容的提问来源于stack exchange,提问作者Allan Bech
相关产品推荐
相关产品推荐

