>source

이 코드를 실행하려고 할 때 다음 오류가 발생합니다. 예외 : 데이터의 열 수가 범위의 열 수와 일치하지 않습니다. 데이터는 0이지만 범위는 1입니다 (줄 15, 파일 "Code").

function getName(){
  const srcSheetName = "result";
  const dstSheetName = "Allergy";
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const srcSheet = ss.getSheetByName(srcSheetName);
  const allergyRange = srcSheet.getRange('F1:BQ' + srcSheet.getLastRow()).getValues();
  const dstSheet = ss.getSheetByName(dstSheetName);
  const lr = dstSheet.getRange("A2:A").getLastRow();
  var names = allergyRange.map(row => row.slice(row.length-12)).forEach((row, i) => {
    if(!row.every(val => val == 0)) return allergyRange[i][0]
});
  const dstRange = dstSheet.getRange(2, 1, dstSheet.getLastRow(), 1);
  const dstValues = dstRange.getValues();
  const putValues = [names];
  dstRange.setValues(putValues);
}

이름 변수 'names'에 너무 많은 열이 있거나 원하는 범위에 값이 없기 때문이라고 가정합니다. setValues ​​함수에 '이름'을 직접 입력하려고했지만 작동하지 않고 "잘못된 값"이라는 또 다른 오류 메시지가 표시됩니다.

업데이트 : 이것은 [이름]이 비어 있기 때문에 발생합니다.

dstRange.setValues(names);

근본적인 문제는 Object.assign () 대신 원래 2D 배열을 조작하기 위해 .map () 메서드를 사용했지만 문헌을 확인할 때여기 .map ()은 새 배열을 만들고 JavaScript는 배열을 객체로 표시합니다.

문제를 진단하기 위해 루프 안팎에서 Logger.log를 사용하여 데이터 세트에 어떤 일이 발생했는지 파악했습니다.

내부 루프 :

var names = allergyRange.map(row => row.slice(row.length-12)).forEach((row, i) => {
    if(!row.every(val => val == 0)) Logger.log(allergyRange[i][0])
});

외부 루프 :

 var names = allergyRange.map(row => row.slice(row.length-12)).forEach((row, i) => {
    if(!row.every(val => val == 0)) return allergyRange[i][0]
});
  Logger.log(names)

루프 내부에서 사용하면 원하는 이름 목록을 얻지 만 루프 외부에서 사용하면 로그를 확인할 때 'null'이 발생합니다.

내가 놓친 중요한 단계가 있어야합니다. '이름'에서 출력을 가져오고 setValues ​​() 또는 다른 것을 사용하여 각 출력을 Google 스프레드 시트의 시트 첫 번째 열에 배치하려면 어떻게해야합니까? 루프의 출력으로 새로운 2D 배열을 생성하는 방법이 있습니까? 아니면 다른 방법을 사용하여 데이터 세트를 조작해야합니까? 나는 JavaScript를 처음 접했습니다. 어떤 팁이라도 환영합니다.

최신 정보:

다음 코드로 .reduce ()를 시도했습니다.

function newNames(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var data = ss.getSheetByName("result");
  var cdata = ss.getSheetByName("Allergy");
  var valuesOfFormData = data.getRange("F1:BQ" + data.getLastRow()).getValues();
  var valuesForOrderChanges = valuesOfFormData.reduce((ar, [c,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ...d]) => {   
    if (d.toString() != 0) ar.push([c]);
    return ar;
  }, []);
  if (valuesForOrderChanges.length > 0) {
    cdata.getRange(1, 1, valuesForOrderChanges.length, valuesForOrderChanges[0].length).setValues(valuesForOrderChanges);
  }
}

원하는 시트의 열 1을 채울 수 있지만 목록은 원래 코드에서와 같이 마지막 12 개 열의 값이있는 이름이 아닌 배열의 모든 이름입니다. 현재 모든 이름 목록을 올바른 열로 가져 오거나 오류없이 원하는 위치에 넣을 수있는 기능없이 올바른 이름 목록을 생성 할 수 있습니다. 내가 무엇을 놓치고 있습니까?

원본 코드를 다음과 같이 조정했을 때 동일한 오류가 발생했습니다.

 if(!row.every(val => val == 0)) return allergyRange[i][0];
},[]);

가까워 지거나 완전히 엉망진창이 된 것 같습니다. Google 시트의 열에 게시 할 수 있도록 .map () 루프의 결과를 어떻게 참조합니까?

최신 정보:

샘플 데이터

샘플 출력

골: 데이터의 행에 BF1 : BQ의 값이 포함되어 있으면 F 열의 이름을 알레르기의 A 열에 넣습니다. '데이터.


  • 답변 # 1

    나는 당신의 목표를 다음과 같이 믿습니다.

    "데이터"시트의 BF2 : BQ 셀에 값이있는 경우 동일한 행의 "F"열에서 값을 검색하고 "알레르기"시트에 값을 입력하려고합니다.

    Google Apps Script를 사용하여이 작업을 수행하려고합니다.

    이 경우 "UPDATE :"섹션에서 하단 스크립트를 수정할 것을 제안합니다.

    수정 된 스크립트 :
    function newNames(){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var data = ss.getSheetByName("result");
      var cdata = ss.getSheetByName("result");
      var valuesOfFormData = data.getRange("F2:BQ" + data.getLastRow()).getValues();  // Modified
      var valuesForOrderChanges = valuesOfFormData.reduce((ar, [c,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ...d]) =>{
        if (d.some(e => e.toString() != "")) ar.push([c]);  // Modified
        return ar;
      }, []);
      if (valuesForOrderChanges.length > 0) {
        cdata.getRange(2, 1, valuesForOrderChanges.length, valuesForOrderChanges[0].length).setValues(valuesForOrderChanges);  // Modified
      }
    }
    
    
    참고:

    약간()

관련 자료

  • 이전 c# - 강력한 형식의보기에서 DropDownList 백 게시
  • 다음 dataframe - 여러 다른 열에 따라 다양한 열 변경 - 아르 자형