Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  5 898
Hei!

Jeg har et Google Docs-dokument med en del tabeller og ønsker å finne en rask metode for å endre kantlinjefargen på alle tabellene.

Normalt kan dette gjøres med denne funksjonen:

Kode

function bodyBordersBlack() {
  var fileId = DocumentApp.getActiveDocument().getId();
  var doc = DocumentApp.openById(fileId);
  var body = doc.getBody();
  var tablesBody = body.getTables();
  for(var i in tablesBody) {
        tablesBody[i].setBorderColor('#000000');
        tablesBody[i].setBorderWidth("1")}
Og en tilsvarende funksjon for hvite kantlinjer (#ffffff).

Problemet er at jeg har tabeller inni tabeller og denne koden endrer kun kantlinjefargen på de ytre tabellene.

Har forsøkt å loope meg gjennomde ytre tabellene for å få tak i de indre, men får ikke dette til. Noen som kan hjelpe her?
Har ikke vært borti Google Apps Script, men... Hva med å putte de tre siste linjene i en egen funksjon som du kaller rekursivt på tabellene?
Limited edition
Moff's Avatar
Jeg opplever ingen problemer med denne koden her, så problemet må nesten ligge et annet sted. Jeg testet med å opprette et blankt dokument og sette inn et par tabeller, inkludert tabeller i tabeller flere nivåer innover. Alle skifter farge. Kan du ev. linke til et eksempeldokument hvor du opplever problemet? Det kan jo hende at du bruker et annet format eller en annen teknikk for å opprette tabeller.

Det eneste jeg måtte gjøre med koden du postet var å legge til en ekstra } helt til slutt. Jeg regner med at dette bare er en copy-paste-feil.
▼ ... over en uke senere ... ▼
LEIK
Pope's Avatar
Trådstarter Donor
Realist1: Dette har jeg forsøkt uten hell.

Moff: Copy-paste-feil ja

Jeg gjorde den samme testen som deg nå og opplever det samme, så det må være noe annet.
Dokumentene er maler som ble laget av noen andre enn meg. Det ble brukt tabeller for å få ønsket formatering, men disse tabellene har vært til bry når dokumentene skal jobbes med. Derfor ønsker jeg å ha et skript som viser alle kantlinjer.

Jeg mistenkte en periode at enkelte tabeller var plassert utenfor dokumentets body og at dette var årsaken til at jeg ikke "fikk tak i de" med linje 4 og 5 i skriptet. Har prøvd å gå alternative veier for å håndtere kantlinjene som ikke endrer farge.

Legger ved eksempeldokument med tilknyttet skript.
https://docs.google.com/document/d/1...it?usp=sharing

Skriptet har en onOpen-trigger som legger til en custom meny hvor man kan kjøre skript 1 for å gjøre kantlinjer svarte og skript 2 for å gjøre de hvite.
Limited edition
Moff's Avatar
Det er noe med disse tabellene som ikke fungerer som normalt. Problemet oppstår ikke kun i kode heller; det er noen av cellene som ikke lar seg endre via de normale verktøyene heller. Det gjelder særlig cellene nederst mot venstre i den første tabellen. Dette kan tyde på at det rett og slett er noe galt med formateringen på dem, og derfor antar jeg at disse tabellene er copy-pastet fra en annen kilde, og at dette på ett eller annet vis skaper trøbbel.

En mulig "løsning" på dette er å klone tabellene i Google Docs, på en sånn måte at ingen korrupt formateringskode blir liggende igjen. Her er et eksempel:

Kode

function onOpen() {
  DocumentApp.getUi().createMenu("Tables")
    .addItem("Fix", "cloneTables")
    .addItem("Black", "setTableColorBlack")
    .addItem("White", "setTableColorWhite")
    .addToUi();
}

function setTableColorBlack() {
  setTableColor("#000000");
}

function setTableColorWhite() {
  setTableColor("#ffffff");
}

function setTableColor(color) {
  var body = DocumentApp.openById(DocumentApp.getActiveDocument().getId()).getBody();
  var tables = body.getTables();
  
  for(var i = 0; i < tables.length; i++) {
    tables[i].setBorderColor(color);
    tables[i].setBorderWidth(1);
  }
}

function cloneTables() {
  var body = DocumentApp.openById(DocumentApp.getActiveDocument().getId()).getBody();
  var tables = body.getTables();
  
  var tablesToRemove = [];
  
  // Clone new tables
  for(var i = 0; i < tables.length; i++) {
    var at = tables[i];
    var bt = body.appendTable();
    
    for(var y = 0; y < tables[i].getNumRows(); y++) {
      var ar = at.getRow(y);
      var br = bt.appendTableRow();
      
      for(var x = 0; x < ar.getNumCells(); x++) {
        var ac = ar.getCell(x);
        var bc = br.appendTableCell();
        
        // Clone cell content
        bc.setText(ac.getText());
        
        // Clone cell style
        var attr = ac.getAttributes();
        
        // Color check (causes exception if empty)
        if(attr["BACKGROUND_COLOR"] == "") {
          delete attr["BACKGROUND_COLOR"];
        }
        
        bc.setAttributes(attr);
      }
    }
    
    tablesToRemove.push(at);
  }
  
  // Delete original tables
  for(var i = 0; i < tablesToRemove.length; i++) {
    body.removeChild(tablesToRemove[i]);
  }
}
Det denne koden gjør er å legge til en ny funksjon i menyen som går gjennom alle tabeller, lager en kopi av dem og alt tekstinnhold, legger dem til i dokumentet og deretter sletter den originale tabellen [color=red](!)[/color].

Merk at jeg skriver tekstinnhold, ikke alt innhold. Dette er ikke skrevet med tanke på nesting, det er kun et proof of concept som fungerer med tekst. Vær derfor veldig forsiktig med å bruke denne koden på noe annet enn den typen dokumenter som du viste til. Det går selvsagt an å se på måter å lage støtte for nesting, bilder og lignende, men jeg tenker det kunne være greit å starte med å bare identifisere problemet.

Etter å ha kjørt denne tabell-fikse-koden så vil koden som setter rammefarge fungere som normalt.
LEIK
Pope's Avatar
Trådstarter Donor
Takk skal du ha! Egentlig godt å høre at problemet ligger litt dypere. Det er dessverre slik at dokumentene jeg trøbler med ikke bare inneholder bilder, men også tabeller i topp og bunntekst, som skriptet ditt ikke klarer å håndtere slik som det er nå. Jeg får blant annet følgende feilmelding: "Exception: Element does not contain the specified child element. (line 66, file "Code")"

// Delete original tables
65 for(var i = 0; i < tablesToRemove.length; i++) {
66 body.removeChild(tablesToRemove[i]);
}