我已经在Google表格中构建了一个“传送带”样式的系统,以便在有空位时将用户从其他位置移到更近的位置。
正在实施此设置的Google表格布局的屏幕截图。
例如,如果某人位于“用户1”中但又离开了,它将“用户2”中的用户移动到“用户1”,“用户3”中的用户移动到“用户2”,依此类推,沿着链条推动它们,确保按顺序使用插槽。
由于要求是基于时间的,因此通常情况下,同时删除用户1、2和3,这意味着一个人留在“用户4”插槽中。使用当前脚本,它将把它们从“用户4”->“用户3”->“用户2”->“用户1”中移出。
此外,由于我已经设置了某些格式(索引匹配),因此我需要单元格显示单词“ None”而不是保持空白。通过检查单元格是否为空白,然后将其值设置为“ None”,我可以轻松地做到这一点。
该脚本有效,但是速度很慢。脚本的总执行时间超过14秒。
这是我正在使用的脚本:
function conveyor() {
var s = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('UsernameSheet');
// LOOP 1
var Username1Val = s.getRange('C3').getDisplayValue();
var Username2Val = s.getRange('I3').getDisplayValue();
var Username3Val = s.getRange('O3').getDisplayValue();
var Username4Val = s.getRange('U3').getDisplayValue();
var Username1 = s.getRange('C3')
var Username2 = s.getRange('I3')
var Username3 = s.getRange('O3')
var Username4 = s.getRange('U3')
if (Username3Val == 'None') {
FourtoThree();
}
if (Username1.isBlank()) {
Username1.setValue('None');
}
if (Username2.isBlank()) {
Username2.setValue('None');
}
if (Username3.isBlank()) {
Username3.setValue('None');
}
if (Username4.isBlank()) {
Username4.setValue('None');
}
if (Username2Val == 'None') {
ThreetoTwo();
}
if (Username1.isBlank()) {
Username1.setValue('None');
}
if (Username2.isBlank()) {
Username2.setValue('None');
}
if (Username3.isBlank()) {
Username3.setValue('None');
}
if (Username4.isBlank()) {
Username4.setValue('None');
}
if (Username1Val == 'None') {
TwotoOne();
}
if (Username1.isBlank()) {
Username1.setValue('None');
}
if (Username2.isBlank()) {
Username2.setValue('None');
}
if (Username3.isBlank()) {
Username3.setValue('None');
}
if (Username4.isBlank()) {
Username4.setValue('None');
}
// LOOP 2
var Username1Val = s.getRange('C3').getDisplayValue();
var Username2Val = s.getRange('I3').getDisplayValue();
var Username3Val = s.getRange('O3').getDisplayValue();
var Username4Val = s.getRange('U3').getDisplayValue();
var Username1 = s.getRange('C3')
var Username2 = s.getRange('I3')
var Username3 = s.getRange('O3')
var Username4 = s.getRange('U3')
if (Username3Val == 'None') {
FourtoThree();
}
if (Username1.isBlank()) {
Username1.setValue('None');
}
if (Username2.isBlank()) {
Username2.setValue('None');
}
if (Username3.isBlank()) {
Username3.setValue('None');
}
if (Username4.isBlank()) {
Username4.setValue('None');
}
if (Username2Val == 'None') {
ThreetoTwo();
}
if (Username1.isBlank()) {
Username1.setValue('None');
}
if (Username2.isBlank()) {
Username2.setValue('None');
}
if (Username3.isBlank()) {
Username3.setValue('None');
}
if (Username4.isBlank()) {
Username4.setValue('None');
}
if (Username1Val == 'None') {
TwotoOne();
}
if (Username1.isBlank()) {
Username1.setValue('None');
}
if (Username2.isBlank()) {
Username2.setValue('None');
}
if (Username3.isBlank()) {
Username3.setValue('None');
}
if (Username4.isBlank()) {
Username4.setValue('None');
}
// LOOP 3
var Username1Val = s.getRange('C3').getDisplayValue();
var Username2Val = s.getRange('I3').getDisplayValue();
var Username3Val = s.getRange('O3').getDisplayValue();
var Username4Val = s.getRange('U3').getDisplayValue();
var Username1 = s.getRange('C3')
var Username2 = s.getRange('I3')
var Username3 = s.getRange('O3')
var Username4 = s.getRange('U3')
if (Username3Val == 'None') {
FourtoThree();
}
if (Username1.isBlank()) {
Username1.setValue('None');
}
if (Username2.isBlank()) {
Username2.setValue('None');
}
if (Username3.isBlank()) {
Username3.setValue('None');
}
if (Username4.isBlank()) {
Username4.setValue('None');
}
if (Username2Val == 'None') {
ThreetoTwo();
}
if (Username1.isBlank()) {
Username1.setValue('None');
}
if (Username2.isBlank()) {
Username2.setValue('None');
}
if (Username3.isBlank()) {
Username3.setValue('None');
}
if (Username4.isBlank()) {
Username4.setValue('None');
}
if (Username1Val == 'None') {
TwotoOne();
}
if (Username1.isBlank()) {
Username1.setValue('None');
}
if (Username2.isBlank()) {
Username2.setValue('None');
}
if (Username3.isBlank()) {
Username3.setValue('None');
}
if (Username4.isBlank()) {
Username4.setValue('None');
}
}
function FourtoThree() {
var s = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('UsernameSheet');
var Username3Name = s.getRange('O3');
var Username3NameVal = s.getRange('O3').getDisplayValue();
var Username3Start = s.getRange('O4');
var Username3StartVal = s.getRange('O4').getDisplayValue();
var Username3Finish = s.getRange('O5');
var Username3FinishVal = s.getRange('O5').getDisplayValue();
var Username3Break = s.getRange('Q7');
var Username3BreakVal = s.getRange('Q7').getDisplayValue();
var Username3Busy = s.getRange('Q6');
var Username3BusyVal = s.getRange('Q6').getDisplayValue();
var Username4Name = s.getRange('U3');
var Username4NameVal = s.getRange('U3').getDisplayValue();
var Username4Start = s.getRange('U4');
var Username4StartVal = s.getRange('U4').getDisplayValue();
var Username4Finish = s.getRange('U5');
var Username4FinishVal = s.getRange('U5').getDisplayValue();
var Username4Break = s.getRange('W7');
var Username4BreakVal = s.getRange('W7').getDisplayValue();
var Username4Busy = s.getRange('W6');
var Username4BusyVal = s.getRange('W6').getDisplayValue();
Username3Name.setValue(Username4NameVal);
Username3Start.setValue(Username4StartVal);
Username3Finish.setValue(Username4FinishVal);
Username3Break.setValue(Username4BreakVal);
Username3Busy.setValue(Username4BusyVal);
Username4Name.clearContent();
Username4Start.clearContent();
Username4Finish.clearContent();
Username4Break.clearContent();
Username4Busy.clearContent();
}
function ThreetoTwo() {
var s = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('UsernameSheet');
var Username2Name = s.getRange('I3');
var Username2NameVal = s.getRange('I3').getDisplayValue();
var Username2Start = s.getRange('I4');
var Username2StartVal = s.getRange('I4').getDisplayValue();
var Username2Finish = s.getRange('I5');
var Username2FinishVal = s.getRange('I5').getDisplayValue();
var Username2Break = s.getRange('K7');
var Username2BreakVal = s.getRange('K7').getDisplayValue();
var Username2Busy = s.getRange('K6');
var Username2BusyVal = s.getRange('K6').getDisplayValue();
var Username3Name = s.getRange('O3');
var Username3NameVal = s.getRange('O3').getDisplayValue();
var Username3Start = s.getRange('O4');
var Username3StartVal = s.getRange('O4').getDisplayValue();
var Username3Finish = s.getRange('O5');
var Username3FinishVal = s.getRange('O5').getDisplayValue();
var Username3Break = s.getRange('Q7');
var Username3BreakVal = s.getRange('Q7').getDisplayValue();
var Username3Busy = s.getRange('Q6');
var Username3BusyVal = s.getRange('Q6').getDisplayValue();
Username2Name.setValue(Username3NameVal);
Username2Start.setValue(Username3StartVal);
Username2Finish.setValue(Username3FinishVal);
Username2Break.setValue(Username3BreakVal);
Username2Busy.setValue(Username3BusyVal);
Username3Name.clearContent();
Username3Start.clearContent();
Username3Finish.clearContent();
Username3Break.clearContent();
Username3Busy.clearContent();
}
function TwotoOne() {
var s = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('UsernameSheet');
var Username1Name = s.getRange('C3');
var Username1NameVal = s.getRange('C3').getDisplayValue();
var Username1Start = s.getRange('C4');
var Username1StartVal = s.getRange('C4').getDisplayValue();
var Username1Finish = s.getRange('C5');
var Username1FinishVal = s.getRange('C5').getDisplayValue();
var Username1Break = s.getRange('E7');
var Username1BreakVal = s.getRange('E7').getDisplayValue();
var Username1Busy = s.getRange('E6');
var Username1BusyVal = s.getRange('E6').getDisplayValue();
var Username2Name = s.getRange('I3');
var Username2NameVal = s.getRange('I3').getDisplayValue();
var Username2Start = s.getRange('I4');
var Username2StartVal = s.getRange('I4').getDisplayValue();
var Username2Finish = s.getRange('I5');
var Username2FinishVal = s.getRange('I5').getDisplayValue();
var Username2Break = s.getRange('K7');
var Username2BreakVal = s.getRange('K7').getDisplayValue();
var Username2Busy = s.getRange('K6');
var Username2BusyVal = s.getRange('K6').getDisplayValue();
Username1Name.setValue(Username2NameVal);
Username1Start.setValue(Username2StartVal);
Username1Finish.setValue(Username2FinishVal);
Username1Break.setValue(Username2BreakVal);
Username1Busy.setValue(Username2BusyVal);
Username2Name.clearContent();
Username2Start.clearContent();
Username2Finish.clearContent();
Username2Break.clearContent();
Username2Busy.clearContent();
}
该脚本的作用是首先运行以检查用户名1-4是否具有空白单元格。如果这样做,则将这些值设置为“无”。
然后,一条IF语句运行以检查用户名3 =无,如果执行,则运行功能FourtoThree,该函数本身将值从用户名4移至用户名3。然后检查用户名2,然后是用户名1。如果值是“ None”,则执行相同类型的数据移动功能。然后,整个功能将运行3次,这是传送带系统需要完成的最大移动次数。
我仍然是Google Apps脚本的新手(嗯,一般来说是JavaScript),所以我把它组合在一起并很高兴它能起作用。
现在,脚本的运行缓慢对于它的使用场景来说正成为问题,请寻找一种优化它的方法。
我根本不希望任何人写一个脚本来减轻我的麻烦,但是如果有人可以提出一个可以实现我想要做的功能的示例,和/或关于如何实现的想法实施它。
答案 0 :(得分:0)
这是您可以尝试的原型,但我不会只使用空白的“ None”
function conveyor() {
var s = SpreadsheetApp.getActiveSpreadsheet();
// Get range C3:W7
var r = s.getSheetByName('Test').getRange(3,3,5,21);
var users = r.getValues();
var formulas = r.getFormulas();
for( var i=0; i<13; i+=6 ) { // Only do it 3 times
if( users[0][i] === "" ) {
users[0][i] = users[0][i+6]; // Username
users[0][i+6] = "";
users[1][i] = users[1][i+6]; // Start time
users[1][i+6] = "";
users[2][i] = users[2][i+6]; // Finish time
users[2][i+6] = "";
users[3][i+2] = users[3][i+8]; // Busy
users[3][i+8] = false;
users[4][i+2] = users[4][i+8]; // Break
users[4][i+8] = false;
}
}
for( var i=0; i<users.length; i++ ) {
for( var j=0; j<users[0].length; j++ ) {
if( formulas[i][j] !== "" ) users[i][j] = formulas[i][j].toString();
}
}
r.setValues(users);
}