2016-06-10 127 views
0

我有兩個用Google Script創建的函數,我需要將變量從第一個函數傳遞到第二個函數。如何從另一個函數訪問變量?

代碼:

function fetch() { 
    var endpoint = 'login'; 
    var url = 'https://example.com/api/'+endpoint; 
    var payload = { 
    'username' : "user", 
    'password' : "pass", 
    } 
    var options = { 
    'method' : 'post', 
    'payload': JSON.stringify(payload), 
    }; 
    var urlResponse = UrlFetchApp.fetch(url, options); 
} 

當我按下一個按鈕,下面的函數被調用:

function logResponse(){ 
    Logger.log(urlResponse); //This must return the data from the urlResponse variable 
} 
+0

範圍:在'function setVar()'之前聲明'a'如果你不這樣做,每個'a'封裝在每個功能,就像有兩個不同的'a' –

回答

0

一點點的解釋:

當你通過變量,上面的聲明函數(例如)將創建一個閉包。並且函數將訪問這個變量。

var a = 11;

function setVar() { 
a = '777'; 
} 

function logVar(){ 
    Logger.log(a); 
} 
+0

我相信對你的建議有一些解釋會有幫助(見上面我的評論) –

+0

我會更新t他問我的代碼 – Valip

1

你的兩個函數(setVar()logVar())有不同的範圍,這意味着他們不能訪問變量彼此內/實體。你要做的是創建一個變量這兩個之外,讓每個函數可以訪問相同的變量,例如:

var a = 0; 

function setVar() { 
    a = 10; 
} 

function logVar() { 
    Logger.log (a); 
} 
+0

我已更新與我的代碼 – Valip

0
function fetch() { 
    var endpoint = 'login'; 
    var url = 'https://example.com/api/'+endpoint; 
    var payload = { 
    'username' : "user", 
    'password' : "pass", 
    } 
    var options = { 
    'method' : 'post', 
    'payload': JSON.stringify(payload), 
    }; 
    // This variable ONLY exists inside of the fetch function. 
    // once this function exits, it is gone. 
    var urlResponse = UrlFetchApp.fetch(url, options); 
} 


function logResponse(){ 
    // Nope, this is an entirely SEPARATE variable with the same name. 
    Logger.log(urlResponse); //This must return the data from the urlResponse variable 
} 

解決方案:要麼一)在價值傳遞給logResponse()var UrlResponse移動到兩個功能可用的外部範圍。但是,請保留分配

選項1

var urlResponse; 
function fetch() { 
    var endpoint = 'login'; 
    var url = 'https://example.com/api/'+endpoint; 
    var payload = { 
    'username' : "user", 
    'password' : "pass", 
    } 
    var options = { 
    'method' : 'post', 
    'payload': JSON.stringify(payload), 
    }; 
    // This variable ONLY exists inside of the fetch function. 

    urlResponse = UrlFetchApp.fetch(url, options); 
} 


function logResponse(){ 
    // Nope, this is an entirely SEPARATE variable with the same name. 
    Logger.log(urlResponse); //This must return the data from the urlResponse variable 
} 

選項2

function fetch() { 
    var endpoint = 'login'; 
    var url = 'https://example.com/api/'+endpoint; 
    var payload = { 
    'username' : "user", 
    'password' : "pass", 
    } 
    var options = { 
    'method' : 'post', 
    'payload': JSON.stringify(payload), 
    }; 
    // This variable ONLY exists inside of the fetch function. 

    var urlResponse = UrlFetchApp.fetch(url, options); 
    logResponse(urlResponse); 
} 


function logResponse(urlResponse){ 
    Logger.log(urlResponse); //This must return the data from the urlResponse variable 
} 
+0

問題請檢查我更新的問題,我加我的代碼 – Valip

+0

OH ..這成爲和完全不同的問題。 –

+0

是的,我認爲第一個例子和我的代碼一樣.. – Valip

1

我想你可能要實現以下目標:

function fetch() { 
    var endpoint = 'login'; 
    var url = 'https://example.com/api/'+endpoint; 
    var payload = { 
    'username' : "user", 
    'password' : "pass", 
    } 
    var options = { 
    'method' : 'post', 
    'payload': JSON.stringify(payload), 
    }; 
    var urlResponse = UrlFetchApp.fetch(url, options); 
    return urlResponse; 
} 

function logResponse(){ 
    Logger.log(fetch()); 
} 

所以,你可以使用「返回」關鍵字在其調用中返回函數的值。

然後,您不需要在函數之外聲明變量(例如在全局範圍中)。 您只需撥打,並將其作爲參數傳遞給您的logResponse()函數。在第2個功能>return urlResponse;

  • - - 在第一個功能

    • >Logger.log(fetch())

    附註:

    所以,要注意這些行當然在外部範圍聲明一個變量可以同時訪問這兩個函數。 但我上面的解決方案似乎是一個更好的選擇。

    還有些建議

    • 您可以將您的函數名重新命名fetch()fetchUrl更加明確。
    • 也爲urlResponse在第一個函數的變量聲明是多餘的,你可以這樣做:

    return UrlFetchApp.fetch(url, options);

    更新:

    帕維爾,看看選項1這傑里米在答案中提出了建議。 總而言之一句話,作爲一個建議,你可以用你的代碼塊(取決於您的環境)爲Immediately-invoked function expression

    看看下面的例子(注意評論) - >

    (function() { 
        // all the inside of this function is a shared scope for two function below 
        'use strict'; 
    
        // this is a declared variable which is accessible for 2nd function 
        // the value assigned will be the result of calling the 1st function 
        var urlResponse = fetch(); 
    
        function fetch() { 
        var endpoint = 'login'; 
        var url = 'https://example.com/api/'+endpoint; 
        var payload = { 
         'username' : "user", 
         'password' : "pass" 
        }; 
    
        var options = { 
         'method' : 'post', 
         'payload': JSON.stringify(payload) 
        }; 
    
        // return the value 
        return UrlFetchApp.fetch(url, options); 
        } 
    
        function logResponse() { 
        // use the shared variable (the value of it is a result of calling fetch() function 
        Logger.log(urlResponse); 
        } 
    
        // then if you want to log your response 
        // call the function 
        logResponse(); 
    
    })(); 
    
  • +0

    我在想這個,但這意味着我必須執行兩次第一個函數: 首先,當我檢查登錄憑證時,第二次當我登錄'urlResponse'時。我希望有另一種方法來解決這個問題... – Valip

    +0

    不知道,我很好。 所以,如果有另一個地方,你可以調用你的fetch()函數。 而且你不想調用它兩次。那麼可能共享範圍是一個解決方案。直到你沒有稱爲依賴注入的東西。 –

    +0

    @PavelValeriu和最好的選擇將使用返回關鍵字,但將值分配給共享作用域中的變量(可用於第二個功能) –

    0

    請告訴我,如果這是您的方案:

    功能fetch()當你運行腳本(打開文檔或在的doGet)被調用,第二個logResponse()從在接口(電子表格按鈕或谷歌的行動調用。 script.run ....)。

    在這種情況下腳本是'運行'兩次,一切都被遺忘在兩次運行之間。你可以做的是: A /傳給你從第一功能到用戶界面得到了價值,並回至第二個功能 B /你在第一功能得到了價值儲存的東西,如:

    function fetch() { 
        var endpoint = 'login'; 
        var url = 'https://example.com/api/'+endpoint; 
        var payload = { 
        'username' : "user", 
        'password' : "pass", 
        } 
        var options = { 
        'method' : 'post', 
        'payload': JSON.stringify(payload), 
        }; 
        var urlResponse = UrlFetchApp.fetch(url, options); 
        PropertiesService.getUserProperties().setProperty("urlResp", urlResponse.getContentText()); 
    } 
    
    function logResponse(){ 
    var urlResponse = PropertiesService.getUserProperties().getProperty("urlResp"); 
        Logger.log(urlResponse); //This must return the data from the urlResponse variable 
    } 
    

    propertiesService只能存儲文本(並且你可以使用除了userproperty之外的東西,比如scriptproperty,或者documentproperty

    +0

    我使用'fetch'函數進行登錄過程,所以當我按下登錄按鈕時會調用它,然後第二個函數也會在按下按鈕時被調用 – Valip

    相關問題