2016-07-30 3 views
2

Google 시트 사이드 바에 서버 기능의 데이터를 표시하려고합니다. 성공 처리기를 사용하여 서버에 대한 비동기 호출을 사용하고 있지만 클라이언트가 어떻게 든 null 값을받습니다. 클라이언트 - 서버 통신에 대한 광범위한 검색에도 불구하고 이유를 파악할 수 없었습니다.Google Apps 스크립트의 성공 처리기가 서버 기능에서 null을받습니다.

현재 서버 기능 끝에있는 로그에는 'flags'객체가 완전히 정의되어 있지만 successHandler 'showErrors'의 시작 부분에있는 콘솔 로그에는 'flags'가 정의되지 않았다고 표시됩니다.

HTML 서비스에서 Google 문서를 확인한 결과 '플래그'는 정수, 문자열 및 문자열 배열을 포함하는 객체이므로 유효한 반환 값이라고 말할 수 있습니다. 나는 '플래그'를 객체에서 단순한 문자열로 변경하려고 시도했지만 'showErrors'에서는 아직 정의되지 않았습니다. '플래그'의 내용이 서버와 클라이언트간에 손실되는 이유를 아는 사람이 있습니까? 미리 감사드립니다!

HTML :

<form onsubmit="google.script.host.close()"> 
 

 
<div id="intro" style="font-style:italic"> 
 
<p><b>Title</b><br><br> 
 
Introduction text</p> 
 
<HR> 
 
<input type="button" style="button" id="start" value="Start" onclick="hideDiv('intro');google.script.run.withSuccessHandler(showErrors).checkList2(0,0)"> <!-- Intro starts loop --> 
 
</div> 
 

 
<div id="showErrors"></div> 
 
</form> 
 

 
<script> 
 
function showErrors(flags){ 
 
    console.log('client side flags:'); 
 
    console.log(flags); 
 
    var div = document.getElementById('showErrors'); 
 
    div.innerHTML = '<p style="font-style:italic">'; 
 
    div.innerHTML += 'Sheet '+flags.pageNum+' of '+flags.numPages+'.'; 
 

 
    //... more div.innerHTML += ... 
 

 
    div.innerHTML += '<input type="button" style="button" value="Next" onclick="google.script.run.withSuccessHandler(showErrors).checkList2('+Number(flags.pageNum)+1+','+flags.totalErrors+')"'; 
 
    div.innerHTML += '<input type="submit" style="button" value="Cancel">'; 
 
} 
 

 
function hideDiv(div){ 
 
    document.getElementById(div).innerHTML=''; // clear div 
 
} 
 
</script>

서버 기능 : 당신이 입력 할 경우 클라이언트에 아무것도 반환하지 않습니다

function checkList2(nComplete,nErrors){ 
 
    
 
    var nSheets=21; 
 
    nComplete = Number(nComplete); 
 
    nErrors = Number(nErrors); 
 
    
 
    var results = errorList(nComplete); // Get results.name (string) and results.errors (array) 
 
    var errors = results.errors; 
 
    if (errors=='') { 
 
    checkList2(nComplete+1,nErrors); // Move on to next sheet 
 
    } else { 
 
    nErrors = nErrors + errors.length;  
 
    
 
    var flags = {}; 
 
    flags.numErrors = errors.length; 
 
    flags.totalErrors = nErrors; 
 
    flags.pageNum = nComplete; 
 
    flags.numPages = nSheets; 
 
    flags.sheetName = results.name; 
 
    flags.errors = errors; 
 
    Logger.log('server side flags:') 
 
    Logger.log(flags) 
 
    
 
    return flags; 
 
    }  
 
}

+0

모든 것이 작동해야합니다. 문제가 발생할 수있는 유일한 곳은 errorList 함수를 호출하는 것입니다. 따라서 함수에 0을 전달하면 오류가 발생하는지 확인하는 것이 좋습니다. –

+0

@ Dimu-Designs, errorList는 잘 작동합니다. 실제로 처음으로 인수가 0이라고하고 값이 반환됩니다. 서버 기능에서 Logger.log (플래그)에서 플래그를 정의하는 방법과 클라이언트 측 함수에서 console.log (플래그)로 정의되지 않는 방법을 이해할 수 없습니다. 그들은 다른 하나를 바로 실행하지 않습니까? –

+0

죄송합니다. 이런 종류의 버그를 처리해야합니다. 나는 단지 몇 가지 아이디어 만 가지고있다 :'checkList2'의 꼭대기에서 뭔가를 반환하면 어떻게 될까? 또한 우연히'checkList2'라는 두 개의 함수가 있습니까? –

답변

1

if 블록 :

if (errors=='') { 
    checkList2(nComplete+1,nErrors); // Move on to next sheet 

    // no return 
} else { 
    nErrors = nErrors + errors.length;  

    var flags = {}; 
    flags.numErrors = errors.length; 
    flags.totalErrors = nErrors; 
    flags.pageNum = nComplete; 
    flags.numPages = nSheets; 
    flags.sheetName = results.name; 
    flags.errors = errors; 
    Logger.log('server side flags:') 
    Logger.log(flags) 

    return flags; 
} 

당신은 재귀 호출을 반환하기 만하면, 나는 당신이 기대하고있는 동작을 얻을 수있을 거라 생각의 모든.

if (errors=='') { 
    return checkList2(nComplete+1,nErrors); // Move on to next sheet 
} else { 
    nErrors = nErrors + errors.length;  

    var flags = {}; 
    flags.numErrors = errors.length; 
    flags.totalErrors = nErrors; 
    flags.pageNum = nComplete; 
    flags.numPages = nSheets; 
    flags.sheetName = results.name; 
    flags.errors = errors; 
    Logger.log('server side flags:') 
    Logger.log(flags) 

    return flags; 
} 
+0

감사합니다! 당신이 말하는대로 이제는 완전히 이해가됩니다. 저는이 부분에 익숙하지 않기 때문에 여전히 기초를 배우고 있습니다. –