>source

주문 정보가 포함 된 한 시트의 데이터를 각 고객 이름을 기준으로 다른 시트 셀로 컴파일하려고합니다. 주문한 항목의 개수와 열 제목을 확인하고 싶습니다. 나는 구글 시트의 공식으로 무차별 대입을 시도했지만 공식이 엉망이되어 올바른 정보를 제공하지 않기 때문에 스크립트 기능을 사용하는 것이 내가하려는 일에 더 좋을 것이라고 생각했습니다. 스크립트를 테스트하기 위해 새 시트를 만들었지 만 경험이 거의 없어서 진행할 수없는 것 같습니다.

두 시트의 일치하는 이름을 기준으로 각 열의 제목 (맨 위 행)과 항목 수를 sheet2의 주문 열로 가져오고 싶습니다. 누구든지 도움을 주거나 통찰력을 제공 할 수 있다면 대단히 감사하겠습니다.

내가 생각해 낸 코드는 다음과 같습니다.

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var orders = ss.getSheetByName("Sheet2");
  var data = ss.getSheetByName("Sheet1");
  var names = orders.getRange("Sheet2!A2:A5");
  var name = names.getValues();
  var startRow = 1
var endRow = ss.getLastRow()
var getRange = ss.getDataRange();
  var getRow = getRange.getRow();
  var title = data.getRange("Sheet1!B1:J1");
  var item = title.getValues();
  var itemCell = data.getRange("Sheet1!B2").getValue();
  var orderCell = orders.getRange(2,2).getValue()
  
  Logger.log(itemCell)
   
  if(itemCell>=0){
    orders.getRange(2,2).setValue("item1 x " +itemCell)
  }

현재 이것은 하나의 셀에서만 원하는 효과를 가지며 행을 완료하지 않고 다음 열에서 반복합니다.

더 큰 데이터 세트에 맞추기 위해 코드를 조정 한 방법은 다음과 같습니다.

function myFunction() {
  const srcSheetName = "Test Data";
  const dstSheetName = "Order Changes";
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // 1. Retrieve source values.
  const srcSheet = ss.getSheetByName(srcSheetName);
  //I changed values  1,1 to change the values that were retreived
  const [[, ...header], ...srcValues] = srcSheet.getRange(1, 1, 
  srcSheet.getLastRow(), srcSheet.getLastColumn()).getValues();
  
  // 2. Create an object using the source values.
  const srcObj = srcValues.reduce((o, [a, ...v]) => {
    const temp = v.reduce((s, r, i) => {
      if (r.toString() != "") s += `${header[i]} ${r}`;
      return s;
    }, "");
    return Object.assign(o, {[a]: temp || ""});
  }, {});
  
  // 3. Retrieve the header column of destination values.
  const dstSheet = ss.getSheetByName(dstSheetName);
  //I changed values 2 or 1 to adjust the destination of values
  const dstRange = dstSheet.getRange(2, 1, dstSheet.getLastRow() - 1);
  const dstValues = dstRange.getValues();
  
  // 4. Create the output values using the header column and the object.
  const putValues = dstValues.map(([a]) => [srcObj[a] || ""]);
  
  // 5. Put the values.
  dstRange.offset(0, 1).setValues(putValues);
}

변경을 수행하고 코드를 실행 한 후 값이 표시되지 않거나 잘못된 데이터가있는 잘못된 열에 표시됩니다.

기능 업데이트의 목표 :

  • Sheet2! A의 이름을 Sheet1! F의 이름과 일치시킵니다.
  • 일치하는 항목이 발견되면 Sheet1! N1 : BQ에서 헤더와 셀 값을 결합합니다. 이것은 Sheet1! F에서 일치하는 이름의 동일한 행에 있어야합니다 (예 : 존 스미스 lm14 1, lm25 2, lm36 1)
  • 결합 된 데이터를 Sheet2! C에 배치
  • Sheet2! A의 모든 이름에 대해 반복합니다.
  • 값이 0 미만인 경우 헤더와 셀 값을 결합하면 안됩니다.

    오해를 명확히하는 데 도움이되기를 바랍니다.

    다음은 더 나은 예제 이미지입니다.


    • 답변 # 1

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

      목표에서 질문의 상단 이미지는 예상 한 출력이고 셀 "B2"는 item1 1 item3 1 item6 2 item9 3 낮은 입력 상황이 사용될 때.

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

      이를 위해 다음과 같은 흐름을 제안하고자합니다.

      소스 값을 검색합니다.

      소스 값을 사용하여 개체를 만듭니다.

      대상 값의 헤더 열을 검색합니다.

      헤더 열과 개체를 사용하여 출력 값을 만듭니다.

      값을 입력하십시오.

      샘플 스크립트 :

      다음 스크립트를 복사하여 스프레드 시트의 스크립트 편집기에 붙여넣고 원본 시트 이름과 대상 시트 이름을 설정하고 실행하십시오. myFunction .

      function myFunction() {
        const srcSheetName = "Sheet1";
        const dstSheetName = "Sheet2";
        const ss = SpreadsheetApp.getActiveSpreadsheet();
        
        // 1. Retrieve source values.
        const srcSheet = ss.getSheetByName(srcSheetName);
        const [[, ...header], ...srcValues] = srcSheet.getRange(1, 1, srcSheet.getLastRow(), srcSheet.getLastColumn()).getValues();
        
        // 2. Create an object using the source values.
        const srcObj = srcValues.reduce((o, [a, ...v]) => {
          const temp = v.reduce((s, r, i) => {
            if (r.toString() != "") s += `${header[i]} ${r}`;
            return s;
          }, "");
          return Object.assign(o, {[a]: temp || ""});
        }, {});
        
        // 3. Retrieve the header column of destination values.
        const dstSheet = ss.getSheetByName(dstSheetName);
        const dstRange = dstSheet.getRange(2, 1, dstSheet.getLastRow() - 1);
        const dstValues = dstRange.getValues();
        
        // 4. Create the output values using the header column and the object.
        const putValues = dstValues.map(([a]) => [srcObj[a] || ""]);
        
        // 5. Put the values.
        dstRange.offset(0, 1).setValues(putValues);
      }
      
      
      참조 :

      getValues ​​()

      setValues ​​(값)

      줄이다()

      지도()

      추가 1 :

      현재 문제에 대해 문제의 원인은 소스 및 대상의 범위가 질문의 샘플 이미지와 다르기 때문입니다. 내 제안 답변은 초기 질문의 샘플 이미지입니다. 스프레드 시트의 구조를 변경 한 경우 제안 된 스크립트를 수정해야합니다. 하지만 I changed values 1,1 to change the values that were retrievedI changed values 2 or 1 to adjust the destination of values , 수정 된 스크립트에 대해 이해할 수 없습니다. 따라서 추가 스크립트로 업데이트 된 질문에 대한 제안 답변을 수정하고 싶습니다.

      업데이트 된 질문과 답변을 통해 원본 범위와 대상 범위가 각각 "N1 : BQ"및 "A52 : C79"임을 확인했습니다. 여기에서 위의 샘플 스크립트를 다음과 같이 수정하십시오.

      에서:
      const [[, ...header], ...srcValues] = srcSheet.getRange(1, 1, srcSheet.getLastRow(), srcSheet.getLastColumn()).getValues();
      
      
      에:
      const [[, ...header], ...srcValues] = srcSheet.getRange("N1:BQ" + srcSheet.getLastRow()).getValues();
      
      

      에서:
      dstRange.offset(0, 1).setValues(putValues);
      
      
      에:
      dstRange.offset(0, 2).setValues(putValues);
      
      
      추가 2 :

      현재 문제에 대해 문제의 원인은 소스 및 대상의 범위가 질문의 첫 번째 업데이트 된 질문과 다르기 때문입니다. 내가 제안한 대답은 첫 번째 업데이트 된 질문의 샘플 이미지에 대한 것입니다. 스프레드 시트의 구조를 변경 한 경우 제안 된 스크립트를 수정해야합니다.

      두 번째로 업데이트 된 질문에서 원본 범위와 대상 범위가 "F1 : BQ"( "F"열이 제목이고 "N1 : BQ"열이 값임) 및 "A2 : C"라는 것을 이해했습니다. 각기. 여기에서 위의 샘플 스크립트를 다음과 같이 수정하십시오.

      function myFunction() {
        const srcSheetName = "Sheet1";
        const dstSheetName = "Sheet2";
        const ss = SpreadsheetApp.getActiveSpreadsheet();
        
        // 1. Retrieve source values.
        const srcSheet = ss.getSheetByName(srcSheetName);
        const [[,,,,,,,, ...header], ...srcValues] = srcSheet.getRange("F1:BQ" + srcSheet.getLastRow()).getValues();
        // 2. Create an object using the source values.
        const srcObj = srcValues.reduce((o, [a,,,,,,,, ...v]) => {
          const temp = v.reduce((s, r, i) => {
            if (r.toString() != "") s += `${header[i]} ${r}`;
            return s;
          }, "");
          return Object.assign(o, {[a]: temp || ""});
        }, {});
        
        // 3. Retrieve the header column of destination values.
        const dstSheet = ss.getSheetByName(dstSheetName);
        const dstRange = dstSheet.getRange(2, 1, dstSheet.getLastRow() - 1);
        const dstValues = dstRange.getValues();
        
        // 4. Create the output values using the header column and the object.
        const putValues = dstValues.map(([a]) => [srcObj[a] || ""]);
        console.log(srcObj)
        // 5. Put the values.
        dstRange.offset(0, 2).setValues(putValues);
      }
      
      

    관련 자료

  • 이전 mysql - sql - 각 id에 대해 다른 열에서 가장 높은 값만 표시 (그룹화 할 수 없음)
  • 다음 dataframe - R df와 인자를 결합