(java?) script som triggas den sista dagen varje månad? Google spreadsheets.

Tråden skapades och har fått 13 svar. Det senaste inlägget skrevs .
1

Halloj!

Jag behöver verkligen hjälp här.

Har försökt få igång ett script i google spreadsheets som triggar den sista dagen varje månad, gärna sent på kvällen, för att skicka in en rapport till mig via mail.

Jag har fixat hela scriptet så att det mailar till mig, men problemet är att det finns som triggeralternativ dagsvis eller veckovis, men inte månadsvis.

Är det någon som kan hjälpa mig att skriva om en dagstrigger så att den BARA kör klart scriptet om det är den sista dagen i månaden. I excelspråk: IF (imorgon = månadsnummer +1; kör;körinte)

Scriptet jag använder ser ut såhär:
https://github.com/jiayao/Google-spreadsheet-PDF-sender/blob/master/pdf_sender.js

Det finns också en förklaring till hur man använder dessa triggers men den hjälper inte mig helt. Tippar man kan få till så att den går av den 30e varje månad. Men månaderna är ju olika långa!!

Google Apps Script - Google Apps Script - Google Code

Den som hjälper mig med detta får en kram och en ask choklader. Jag har HELT kört fast! :/

//K

Jag har gjort en funktion som ser ut såhär:

[ATTACH="CONFIG"]31933[/ATTACH]

[ATTACH="CONFIG"]31934[/ATTACH]

Nu har jag alltså en möjlighet att lägga till en dag på dagens datum, och sedan se om månadsnummer inte är likadana. (för att provocera så drog jag till med en massa extra dagar i bild två, så att man ser att talen inte är lika)

Men hur får jag triggern till scriptet att kolla detta och låta sig styras utifrån detta?

Det är nu kanske enkelt. =IF (B6=C6;inte köra script;köra script)

Bara att få in den rackarn i scriptet då

//K

I Excel kan du räkna fram månadens sista dag genom att göra såhär:
=DAY(DATE(YEAR(NOW()),MONTH(NOW())+1,1)-1)
Vilket tar fram dagen ur ett datum som man konstruerar med DATE (som tar år, månad och dag) man konstruerar det med nuvarande månad plus 1. Du får alltså nästa månads första dag. Minskar man detta datum med 1 får man sista dagen i föregående månad - som är denna månaden. Fiffigt va?
En IF-sats kan då se ut såhär:
=IF(DAY(DATE(YEAR(NOW()),MONTH(NOW())+1,1)-1)=DAY(NOW()),"Sista dagen i månaden!","Inte sista dagen i månaden!")

Javascript har en klass som heter Date (och det har typ alla objektorienterade språk på jorden också).

Om du exempelvis skapar ett nytt Date-objekt som "den -1 mars 2012" brukar det tolkas som 29 februari 2012 (i år, annars 28).

På så sätt borde du kunna jämföra månadsvärdet på två datum (idag och i morgon) och trigga om skillnaden är större än 0.

Edit: 2 svar på 2 minuter! 99or har inget liv på fredagskvällar!!

Hahaha.

Vi har verkligen inget liv!

Tack för de två svaren, det är helt klart på rätt väg. Men hur skall jag knyta det samman med googles triggers för script som finns i länken i första posten?

Jag har verkligen NOLL koll på scripten, excelbiten är jag ganska haj på!

Jag har i en annan tråd fått hjälp att bygga lite olika google form grejer för timredovisning, utgiftsrapport, flextid osv. Nu vill jag skapa en funktion som sänder in rapporten till min mail i PDF format i slutet på varje månad så att jag bara kan ge den till chefen utan att behöva skriva in det manuellt. (databasen uppdateras från små appar i min mobil)

//K

Så här kan det bli om jag förstår dig rätt, i Javascript.

Tag dagens datum i två upplagor (1, 2), lägg till en dag på den andra (3). Om dagens datum är 2012-02-10 blir den andra 2012-02-11. Jämför månadsvärdet (4).

var today = new Date();                                            (1)

var tomorrow = new Date();                                         (2)
tomorrow.setDate(today.getDate() + 1);                             (3)
	
if (tomorrow.getMonth() - today.getMonth() != 0)                   (4)
{
    // Do stuff
}

Vill du bara skicka på kvällen kan du exempelvis lägga till i if-satsen:

if (tomorrow.getMonth() - today.getMonth() != 0 && today.getHours() >= 22)                   (4)

Då kommer den inte skicka något förrän 22:00.

Edit: ändrade olikheten till inte lika med istället för större än 0. Exempelvis dec - jan blir ju -11 annars.

Längre ned på denna sida:

Google Apps Script - Google Apps Script - Google Code

Står det lite om tidsdrivna events, men jag har verkligen inte en SUSNING om hur jag liksom skall baka ihop allt till något som fungerar. Det är lätt för mig att skriva om kod så att den fungerar som jag vill när den redan fungerar. Men att skriva ihop ny och egen kod blir som jättesvårt..

Är det på linje 31,

function onOpen() {

Man skall ändra eller byta ut något så att det blir en annan trigger?

//K

Kan jag på något sätt baka in detta i scriptet nedan? (är det java?)

var ENABLED_CELL = 1;
var TOKEN_CELL = 2;
var EMAIL_CELL = 3;
var BCC_CELL = 4;
var SUBJECT_CELL = 5;
var BODY_CELL = 6;
var SHEET_NAME_CELL = 7;
var SHEET_GID_CELL = 8;

var SPREADSHEET_URL = "https://spreadsheets.google.com/feeds/downloa...";
var MAX_CONFIG_ROWS = 1000;
var MAX_EXPORT_SHEETS = 50;
var EXPORT_FORMAT = "pdf";

function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
menuEntries = [{name: "Send as PDF", functionName: "sendAsPdf"}];
ss.addMenu("PDF Sender", menuEntries);
var configSheet = getConfigSheet();
configSheet.getRange(1, ENABLED_CELL).setValue("Enabled");
configSheet.getRange(1, TOKEN_CELL).setValue("Auth Token");
configSheet.getRange(1, EMAIL_CELL).setValue("Email");
configSheet.getRange(1, BCC_CELL).setValue("Bcc");
configSheet.getRange(1, SUBJECT_CELL).setValue("Subject");
configSheet.getRange(1, BODY_CELL).setValue("Body");
configSheet.getRange(1, SHEET_NAME_CELL).setValue("Export sheet name");
configSheet.getRange(1, SHEET_GID_CELL).setValue("Export sheet gid");
}

function sendAsPdf() {
var configSheet = getConfigSheet();
for (var i = 2; i < MAX_CONFIG_ROWS; i++) {
if (configSheet.getRange(i, 2).getValue()) {
sendForConfigRow(i);
} else {
break;
}
}
}

function sendForConfigRow(row) {
if (getConfig(row, ENABLED_CELL) != true) {
return;
}
var attachments = [];
var sheetName = getConfig(row, SHEET_NAME_CELL);
for (var i = 0; i < MAX_EXPORT_SHEETS; i++) {
var sheetGid = getConfig(row, SHEET_GID_CELL + i);
Logger.log("sheet name:" + sheetName + ", gid:" + sheetGid);
if (!String(sheetGid).length) {
break;
}
var docId = SpreadsheetApp.getActiveSpreadsheet().getId();
var url = SPREADSHEET_URL + docId + "&exportFormat=" + EXPORT_FORMAT + "&gid=" + sheetGid;
var auth = "AuthSub token=\"" + getConfig(row, TOKEN_CELL) + "\"";
var attempts = 0;
while (attempts++ < 5) {
try {
var res = UrlFetchApp.fetch(url, {headers: {Authorization: auth}});
break;
} catch (e) {
if (e.message.indexOf("Timeout") == -1) {
Browser.msgBox("Error occurred when exporting spreadsheet:" + e.message);
return;
}
}
}
var content = res.getContent();
var responseCode = res.getResponseCode();
if (responseCode != 200 || res.getContentText().indexOf("/ServiceLoginAuth") != -1) {
Logger.log("Fetch url:" + url + " failed with " + responseCode);
Browser.msgBox("Error occurred when exporting spreadsheet to pdf, it might be caused by auth token being expired");
return;
}
attachments.push({fileName:sheetName +"_" + i + "." + EXPORT_FORMAT, content: content, mimeType:"application/pdf"});
}
var bcc = getConfig(row, BCC_CELL);
Logger.log("BCC to:" + bcc);
MailApp.sendEmail(getConfig(row, EMAIL_CELL), getConfig(row, SUBJECT_CELL),
getConfig(row, BODY_CELL), {attachments:attachments, bcc: bcc});
}

function getConfig(row, col) {
var configSheet = getConfigSheet();
return configSheet.getRange(row, col).getValue();
}

function getConfigSheet() {
var name = "script_config";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name);
if (!sheet) {
sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(name);
Logger.log("Created sheet " + name);
}
return sheet;
}

Ursprungligen av kebarb:

Kan jag på något sätt baka in detta i scriptet nedan? (är det java?)

Nej, det ska vara Javascript vad jag kan se. Helt annan grej.

Misstänkte att det inte var som jag tänkte mig.

java script och java. jag har aldrig riktigt förstått skillnaden även om många påpekat för mig att det är två olika saker.

Men jag tror att det skall gå att få in en funktion där. Och om det inte fungerar med Java kod som du nämnde tidigare så borde man kunna få den att referera till de cellerna som jag gjort i arken (en tidigare post med två bilder) där jag bara jämför idag med nästa dag.

Jag har en cell i databasen, som redan visar om imorgon är en ny månad eller inte, så den biten är löst kan man säga. Men hur får jag nu scriptet att aktiveras om den celler är exempelvis 1 istället för 0?

Kan jag skriva om koden så att den tittar på en cell i arket?

//K

I koden här:

function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
menuEntries = [{name: "Send as PDF", functionName: "sendAsPdf"}];
ss.addMenu("PDF Sender", menuEntries);
var configSheet = getConfigSheet();
configSheet.getRange(1, ENABLED_CELL).setValue("Enabled");
configSheet.getRange(1, TOKEN_CELL).setValue("Auth Token");
configSheet.getRange(1, EMAIL_CELL).setValue("Email");
configSheet.getRange(1, BCC_CELL).setValue("Bcc");
configSheet.getRange(1, SUBJECT_CELL).setValue("Subject");
configSheet.getRange(1, BODY_CELL).setValue("Body");
configSheet.getRange(1, SHEET_NAME_CELL).setValue("Export sheet name");
configSheet.getRange(1, SHEET_GID_CELL).setValue("Export sheet gid");
}

Så refererar scriptet till ett ark där man ställer in kriterier för vad scriptet skall göra. Det är inga problem att lägga till en cell på det arket, där man kan ha ETT eller NOLL beroende på om det är sista dagen i månaden.

Men hur får jag scriptet att INTE sända om det är ett visst värde?

//K

Problemet är löst, genom att använda vanliga datumfunktioner i excel efter inrådan i annan tråd och sedan använda dessa för att styra aktiveringscellen i scriptet.

Mycket nöjd!

Tack för all hjälp!

//K

  • Medlem
  • Göteborg
  • 2012-02-14 11:55
Ursprungligen av kebarb:

Problemet är löst, genom att använda vanliga datumfunktioner i excel efter inrådan i annan tråd och sedan använda dessa för att styra aktiveringscellen i scriptet.

Länka gärna till den aktuella tråden, så att vi kan förstå hur du löste det.

OT: Har aldrig tänkt på att man kunde scripta med GoogleDocs, måste genast kolla upp....

https://github.com/jiayao/Google-spreadsheet-PDF-sender

Här är scriptet jag använder, sedan använder jag vanliga excelkommandon för datum och triggar där sändfunktionen med hjälp av en trigger som går 2330 varje dag, samt en funktion som säger 1 om imorgon är en ny månad. Ganska enkelt upplägg.

Det jag har problem med nu är att få till AUTH token att autouppdateras. om någon är duktig på javascript så är jag överjävligt glad för hjälp på den biten.

Google spreadsheets har massor av scriptmöjligheter med automatiska mail, pdfer, excelark och sånt skoj. fantasin stoppar.

//K

1
Bevaka tråden