Google Apps 스크립트로 모든 두 번째 열을 섞는 방법은 무엇입니까?

Pabsdenn

Google Apps 스크립트로 C가 4이면 D : E, F : G, H : I, J : K를 랜덤 화하고 싶습니다.

현재이 비효율적이고 시간 소모적 인 코드를 사용합니다.

function shuffleAnswers() {
 var arr = [0, 2, 4, 6]; 
 for (var i = 2; i < lastRow()+1; i++)
 {
   var amount = sheet().getRange(i,3).getValue();
   if (amount == 4)
   {
     var source = sheet().getRange(i,4,1,2);
     var column = 4 + arr[(Math.random() * arr.length) | 0];
     var destination = sheet().getRange(i,column,1,2);
     var valuesSource = source.getValues();
     var valuesDestination = destination.getValues();
     source.setValues(valuesDestination);
     destination.setValues(valuesSource);     
   }
 }
 arr = [-2, 0, 2, 4]; 
 for (var i = 2; i < lastRow()+1; i++)
 {
   var amount = sheet().getRange(i,3).getValue();
   if (amount == 4)
   {
     var source = sheet().getRange(i,6,1,2);
     var column = 6 + arr[(Math.random() * arr.length) | 0];
     var destination = sheet().getRange(i,column,1,2);
     var valuesSource = source.getValues();
     var valuesDestination = destination.getValues();
     source.setValues(valuesDestination);
     destination.setValues(valuesSource);     
   }
 }
 arr = [-4, -2, 0, 2]; 
 for (var i = 2; i < lastRow()+1; i++)
 {
   var amount = sheet().getRange(i,3).getValue();
   if (amount == 4)
   {
     var source = sheet().getRange(i,8,1,2);
     var column = 8 + arr[(Math.random() * arr.length) | 0];
     var destination = sheet().getRange(i,column,1,2);
     var valuesSource = source.getValues();
     var valuesDestination = destination.getValues();
     source.setValues(valuesDestination);
     destination.setValues(valuesSource);     
   }
 }

 arr = [-6, -4, -2, 0]; 
 for (var i = 2; i < lastRow()+1; i++)
 {
   var amount = sheet().getRange(i,3).getValue();
   if (amount == 4)
   {
     var source = sheet().getRange(i,10,1,2);
     var column = 10 + arr[(Math.random() * arr.length) | 0];
     var destination = sheet().getRange(i,column,1,2);
     var valuesSource = source.getValues();
     var valuesDestination = destination.getValues();
     source.setValues(valuesDestination);
     destination.setValues(valuesSource);     
   }
 }
}

아이디어가 있습니까? 아마도 range.randomize ()? C = 4 인 모든 행은 무작위 화되어야합니다. 여러 행의 열을 같은 위치로 변경해서는 안됩니다.

더 마스터

왜 그렇게 느린가요?

  • 루프 내에서 getValues를 사용하면 스크립트 속도가 상당히 느려집니다. 작업을 일괄 처리하는 것이 중요합니다.

스크립트 흐름 :

  • [[1,2,5,6,3,4,7,8]]과 같이 1에서 8 사이의 임의의 숫자 배열을 만든 다음 해당 숫자를 새 행의 인덱스로 사용합니다.
  • Get all values from the sheet and rearrange only rows where C=4 and set back all values in one shot.

Sample script:

/* Create a Random arrray of numbers from 1 to 8 with couples
 * eg:[1,2,5,6,3,4,7,8]*/
const doubleShuffleFix = (n = 4) => {
  const generator = function*() {//TODO: boilerplate- can be avoided 
    let i = 1;
    yield i;
    while (true) {
      if (i < (n - 1) * 2) {
        yield (i += 2);
      } else {
        break;
      }
    }
  };
  const available = [...generator()];

  //Durstenfeld algo
  for (let i = available.length - 1; i > 0; i--) {
    let rand = Math.floor(Math.random() * i);
    [available[i], available[rand]] = [available[rand], available[i]];
  }
  return available.map(num => [num, ++num]).flat();
};

function shuffleAnswer() {
  const s = SpreadsheetApp.getActive().getSheetByName('Sheet1'),
    rg = s.getRange(2, 3, s.getLastRow() - 1, 9),
    values = rg.getValues();

  rg.setValues(
    values.map(row => {
      if (row[0] === 4) {
        return [4, ...doubleShuffleFix().map(num => row[num])];
      }
      return row;
    })
  );
}

References:

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

UNIX : sed를 사용하여 4 줄 세트로 모든 첫 번째 및 두 번째 줄을 인쇄하는 방법은 무엇입니까?

분류에서Dev

Datatable : 첫 번째 행과 첫 번째 열을 모두 수정하는 방법은 무엇입니까?

분류에서Dev

첫 번째 배열을 두 번째 배열로 병합하고 덮어 쓰는 방법은 무엇입니까?

분류에서Dev

모든 (nx) 번째 값에서 열의 모든 n 번째 값을 빼는 방법은 무엇입니까?

분류에서Dev

Win7의 기본 모니터로 돌아가는 두 번째 모니터에서 창을 열어 두는 방법은 무엇입니까?

분류에서Dev

파이프에서 모든 두 번째 바이트를 제거하는 방법은 무엇입니까?

분류에서Dev

두 배열을 비교하고 하나의 모든 항목이 두 번째 배열에 있는지 확인하는 방법은 무엇입니까?

분류에서Dev

recyclerview의 모든 두 번째 항목을 다른 색상으로 다시 칠하도록 프로그래밍하는 방법은 무엇입니까? (LinearLayout)

분류에서Dev

문자의 두 번째 또는 세 번째 발생까지 모든 것을 제거하는 파일의 이름을 바꾸는 방법은 무엇입니까?

분류에서Dev

Google Sheets-열에서 두 번째 (마지막 두 번째) 비어 있지 않은 셀을 찾는 방법은 무엇입니까?

분류에서Dev

awk를 사용하여 첫 번째 열과 두 번째 열의 첫 번째 줄을 단일 열로 인쇄하는 방법은 무엇입니까?

분류에서Dev

문자열 목록에서 n 번째 문자 목록을 모두 만드는 방법은 무엇입니까?

분류에서Dev

다른 테이블에서 세 번째 열로 두 열을 계산하는 방법은 무엇입니까?

분류에서Dev

두 번째 밑줄 이후의 모든 항목을 제거하고 다른 열은 유지하는 방법은 무엇입니까?

분류에서Dev

첫 번째 ListView의 선택한 값을 두 번째 ListView로 전송하는 방법은 무엇입니까?

분류에서Dev

스프레드 시트 용 Google 스크립트로 모든 사람을 보호하는 방법은 무엇입니까?

분류에서Dev

첫 번째 솔루션으로 두 번째 장갑 모델을 초기화하는 방법은 무엇입니까?

분류에서Dev

정규식으로 두 번째 부분 문자열을 제거하는 방법은 무엇입니까?

분류에서Dev

모든 tr 그룹의 첫 번째 행을 스타일링하는 방법은 무엇입니까?

분류에서Dev

두 번째 문자가 숫자 인 현재 디렉토리의 모든 파일을 나열하는 방법은 무엇입니까?

분류에서Dev

두 번째 모니터 연결을 끊은 후 오프 스크린 창을 복구하는 방법은 무엇입니까?

분류에서Dev

일치하거나 첫 번째 숫자가 두 번째 숫자보다 작은 두 숫자로 문자열을 grep하는 방법은 무엇입니까?

분류에서Dev

텍스트에서 문자열의 모든 x 번째 발생을 RegEx로 바꾸는 방법은 무엇입니까?

분류에서Dev

awk를 사용하여 두 열을 기반으로 모든 열을 얻는 방법은 무엇입니까?

분류에서Dev

마우스를 두 번째 화면 모니터로 이동하는 방법은 무엇입니까?

분류에서Dev

Bootstrap에서 두 번째 행의 두 번째 열을 동일한 첫 번째 열 또는 첫 번째 행에 정렬하는 방법은 무엇입니까?

분류에서Dev

Excel 또는 GSheet에서 두 번째 열의 값으로 첫 번째 열의 동일한 값으로 목록을 정렬하는 방법은 무엇입니까?

분류에서Dev

모든 django 모델 등을 스크립트로 가져 오는 방법은 무엇입니까?

분류에서Dev

텍스트 파일에서 두 번째 및 세 번째 열을 잘라내는 방법은 무엇입니까? 파이썬

Related 관련 기사

  1. 1

    UNIX : sed를 사용하여 4 줄 세트로 모든 첫 번째 및 두 번째 줄을 인쇄하는 방법은 무엇입니까?

  2. 2

    Datatable : 첫 번째 행과 첫 번째 열을 모두 수정하는 방법은 무엇입니까?

  3. 3

    첫 번째 배열을 두 번째 배열로 병합하고 덮어 쓰는 방법은 무엇입니까?

  4. 4

    모든 (nx) 번째 값에서 열의 모든 n 번째 값을 빼는 방법은 무엇입니까?

  5. 5

    Win7의 기본 모니터로 돌아가는 두 번째 모니터에서 창을 열어 두는 방법은 무엇입니까?

  6. 6

    파이프에서 모든 두 번째 바이트를 제거하는 방법은 무엇입니까?

  7. 7

    두 배열을 비교하고 하나의 모든 항목이 두 번째 배열에 있는지 확인하는 방법은 무엇입니까?

  8. 8

    recyclerview의 모든 두 번째 항목을 다른 색상으로 다시 칠하도록 프로그래밍하는 방법은 무엇입니까? (LinearLayout)

  9. 9

    문자의 두 번째 또는 세 번째 발생까지 모든 것을 제거하는 파일의 이름을 바꾸는 방법은 무엇입니까?

  10. 10

    Google Sheets-열에서 두 번째 (마지막 두 번째) 비어 있지 않은 셀을 찾는 방법은 무엇입니까?

  11. 11

    awk를 사용하여 첫 번째 열과 두 번째 열의 첫 번째 줄을 단일 열로 인쇄하는 방법은 무엇입니까?

  12. 12

    문자열 목록에서 n 번째 문자 목록을 모두 만드는 방법은 무엇입니까?

  13. 13

    다른 테이블에서 세 번째 열로 두 열을 계산하는 방법은 무엇입니까?

  14. 14

    두 번째 밑줄 이후의 모든 항목을 제거하고 다른 열은 유지하는 방법은 무엇입니까?

  15. 15

    첫 번째 ListView의 선택한 값을 두 번째 ListView로 전송하는 방법은 무엇입니까?

  16. 16

    스프레드 시트 용 Google 스크립트로 모든 사람을 보호하는 방법은 무엇입니까?

  17. 17

    첫 번째 솔루션으로 두 번째 장갑 모델을 초기화하는 방법은 무엇입니까?

  18. 18

    정규식으로 두 번째 부분 문자열을 제거하는 방법은 무엇입니까?

  19. 19

    모든 tr 그룹의 첫 번째 행을 스타일링하는 방법은 무엇입니까?

  20. 20

    두 번째 문자가 숫자 인 현재 디렉토리의 모든 파일을 나열하는 방법은 무엇입니까?

  21. 21

    두 번째 모니터 연결을 끊은 후 오프 스크린 창을 복구하는 방법은 무엇입니까?

  22. 22

    일치하거나 첫 번째 숫자가 두 번째 숫자보다 작은 두 숫자로 문자열을 grep하는 방법은 무엇입니까?

  23. 23

    텍스트에서 문자열의 모든 x 번째 발생을 RegEx로 바꾸는 방법은 무엇입니까?

  24. 24

    awk를 사용하여 두 열을 기반으로 모든 열을 얻는 방법은 무엇입니까?

  25. 25

    마우스를 두 번째 화면 모니터로 이동하는 방법은 무엇입니까?

  26. 26

    Bootstrap에서 두 번째 행의 두 번째 열을 동일한 첫 번째 열 또는 첫 번째 행에 정렬하는 방법은 무엇입니까?

  27. 27

    Excel 또는 GSheet에서 두 번째 열의 값으로 첫 번째 열의 동일한 값으로 목록을 정렬하는 방법은 무엇입니까?

  28. 28

    모든 django 모델 등을 스크립트로 가져 오는 방법은 무엇입니까?

  29. 29

    텍스트 파일에서 두 번째 및 세 번째 열을 잘라내는 방법은 무엇입니까? 파이썬

뜨겁다태그

보관