Google apps script 我想编辑一个Google脚本,这样它就可以在特定的工作表中洗牌特定的行

Google apps script 我想编辑一个Google脚本,这样它就可以在特定的工作表中洗牌特定的行,google-apps-script,google-sheets,Google Apps Script,Google Sheets,在本文中,我尝试了以下代码: function shuffleRows() { var ss=SpreadsheetApp.getActive(); var sh=ss.getActiveSheet(); var rg=sh.getDataRange(); var vA=rg.getValues(); var lr=sh.getLastRow(); sheet.sort(function(a,b){return Math.floor(Math.random()*range

在本文中,我尝试了以下代码:

function shuffleRows() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var lr=sh.getLastRow();
  sheet.sort(function(a,b){return Math.floor(Math.random()*range)-Math.floor(Math.random()*range);
  });
  rg.setValues(sheet);
}

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Shuffle ZOO",
    functionName : "shuffleRows",
  }];
  sheet.addMenu("Shuffle ZOO", entries);
};
当需要洗牌整张纸时,它可以很好地工作。但是,我需要脚本来洗牌一个特定的范围,即I2:I8在一个特定的表中,即Ark 5

我想我必须用这些行替换:

  var sheet = SpreadsheetApp.getActive().getSheetByName("Ark5");
  var range = sheet.getRange("I2:I8");

我需要编辑什么?

我终于得到了它,尽管我不确定它是否是最好的解决方案

function shuffleRows() {
//  var sheet = SpreadsheetApp.getActive().getSheetByName("Ark5");
//  var range = sheet.getRange("I2:I8");


  var ss=SpreadsheetApp.getActive().getSheetByName("Ark5");
  var sh=ss;
  var rg=sh.getRange("I2:I8");
  var vA=rg.getValues();
  var lr=sh.getLastRow();
  vA.sort(function(a,b){return Math.floor(Math.random()*lr)-Math.floor(Math.random()*lr);
  });
  rg.setValues(vA);
}

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Bland alle dyrene",
    functionName : "shuffleRows",
  }];
  sheet.addMenu("Bland alle dyrene", entries);
};
试试这个:

function runOne(rs,re) {
  var rs=rs||2;//row start
  var re=re||8;//row end
  var ss=SpreadsheetApp.getActive()
  var sh=ss.getSheetByName("Ark5");
  var rg=sh.getRange(rs,1,re-rs+1,sh.getLastColumn());
  var vA=rg.getValues();
  var iA=[];//The index array
  vA.forEach(function(r,i){iA.push(i)});
  var oA=[];
  iA.sort(function(a,b){return Math.floor(Math.random()*iA.length)-Math.floor(Math.random()*iA.length);});//apply sort to index array
  iA.forEach(function(e,i){oA.push(vA[iA[i]]);});//reposition rows based upon sorted index array
  sh.getRange(rs,1,oA.length,oA[0].length).setValues(oA);//post repositioned rows
}

它工作正常,这是不可能的。工作表在ShuffreRows中未定义。我想我必须用这句话来代替,你为什么不试试看呢?@大师我确实试过了,但我一直失败。你这是什么意思?那么我可以优化它吗?我的意思是-我可以阅读,但我不能把它转化为具体的事情。我不能帮你。如果您在实现该算法时遇到了一个特定/焦点问题,请在尝试多次后向提出一个新问题。好的-谢谢。谢谢。它按预期工作,但在我最终得到下面的解决方案的过程中,我需要将数字与某一行中的名称交换,并且仅由一个按钮触发。你确实回答了原来的问题:-知道你用名字交换数字是什么意思,所以当你问这个问题时,请提供一个例子。