2013-07-13 10 views
5

Ho la seguente funzione in una cella. Legge data da un'altra cella, che calcola l'età e la trasforma in formato "3 settimane 5 giorni"Funzione personalizzata di Google Spreadsheet composta da funzioni di foglio di calcolo integrate

=INT((TODAY()-D19)/7)&" weeks, "&(TODAY()-D19-(INT((TODAY()-D19)/7)*7))&" days" 

Funziona.

Ora vorrei sostituire questa lunga stringa in una funzione semplice:

=AGEINWEEKS(D19) 

Come posso fare questo?

ho già provato a scrivere questo script in Script Editor

function ageInWeeks(from_date) { 
    return SpreadsheetApp.getActiveSheet().getRange("D16").setFormula('=ROUND((TODAY()-D16)/7)&" weeks, "&(TODAY()-D16-(ROUND((TODAY()-D16)/7)*7))&" days"'); 
} 

ma restituisce errore

error: You do not have permission to call setFormula (line 3, file "Code")

Grazie in anticipo!

saluti, Tomaž

risposta

7

Se stai cercando di creare una funzione personalizzata per dare lo stesso risultato della tua funzione di foglio di calcolo, dovrai utilizzare Google Apps Script in modo che esegua il calcolo, piuttosto che tentare di usarlo per impostare una formula nel foglio di calcolo (che, come ha sottolineato Serge, non funzionerà in quanto non consentito).

(Inoltre, tanto per essere chiari per i lettori futuri, Google Apps Script e le loro funzioni personalizzate non possono eseguire calcoli utilizzando Google Spreadsheets formule. Si eseguono calcoli in javascript lingua. D'altra parte, lo script, tramite setFormulas può essere utilizzato per scrivere una formula di foglio di calcolo in una cella, in cui la formula del foglio di calcolo eseguirà un calcolo ... ma non può farlo se lo script viene utilizzato come funzione personalizzata (cioè se viene chiamato all'interno di una cella con un segno =) ma solo se lo script viene chiamato da un altro metodo, ad esempio una voce di menu o da un trigger, che si tratti di un trigger che risponde a un foglio di calcolo o un . Timer)

Quindi, è possibile scrivere javascript nella funzione personalizzata per calcolare le settimane, giorni e uno di questi script potrebbe essere:

function ageInWeeks(date) { 
var mil = new Date() - new Date(date).getTime() 
var seconds = (mil/1000) | 0; 
mil -= seconds * 1000; 

var minutes = (seconds/60) | 0; 
seconds -= minutes * 60; 

var hours = (minutes/60) | 0; 
minutes -= hours * 60; 

var days = (hours/24) | 0; 
hours -= days * 24; 

var weeks = (days/7) | 0; 
days -= weeks * 7; 
return weeks +' wks, ' + days + ' days' 

} 

Questo potrebbe essere messo nel foglio di calcolo in una cella, tranne D19 se fa riferimento a D19, come ad esempio:

dove la cella D19 contiene una data nel passato.

(Si noti che la funzione personalizzata è probabile che sia più lento di formula foglio di lavoro originale)

+0

Grazie per la risposta completa! Il codice funziona perfettamente. – tomazzlender

2

Dalle documentation : funzioni personalizzate valori di ritorno, ma non possono impostare i valori al di fuori delle cellule in cui si trovano. Nella maggior parte dei casi, una funzione personalizzata nella cella A1 non può modificare cella A5.

Se descrivi il tuo caso di utilizzo tipico, potresti suggerire un altro approccio.

+0

se la funzione restituisce qualcosa come '[ "", "", "", "", "Valore"]', * A5 * sarà popolato da 'Valore' –