Usa le macro di ONLYOFFICE per copiare le colonne in fogli di calcolo separati

18 luglio 2024By Alice

Le macro di ONLYOFFICE aprono infinite possibilità, trasformando compiti complessi che richiederebbero ore in processi realizzabili con un solo clic. Di recente abbiamo ricevuto da un utente di ONLYOFFICE la richiesta di creare una macro che potesse automatizzare il flusso di lavoro copiando i dati in modo efficiente.

Questo articolo approfondisce le specifiche di questa richiesta, spiegando come abbiamo sviluppato una macro per soddisfare questa esigenza ed esplorando le implicazioni più ampie delle macro di ONLYOFFICE.

Use ONLYOFFICE macros to copy columns into separate spreadsheets

Costruzione della macro

  const oWorksheet = Api.GetActiveSheet();
  const oRange = oWorksheet.GetSelection();

Per cominciare, otteniamo il foglio di lavoro attivo e la selezione nelle variabili oWorksheet e oRange.

Ora esamineremo le 3 funzioni che compongono questa macro, ovvero: getColHeader(), copyColumns() copyValues().

Prima di tutto, la funzione getColHeader().

  const getColHeader = (colNumber) => {
    const targetColumn = oRange.GetCols(colNumber);
    const colHeader = targetColumn.GetValue()[0][0];
    return colHeader !== null && colHeader !== "" ? colHeader : -1;
  };

La funzione getColHeader() accetta un singolo parametro, colNumber, che specifica il numero della colonna. Questa funzione verifica la presenza di un valore valido nella prima riga della colonna specificata: se esiste, lo restituisce, altrimenti restituisce -1.

A seguire, vedremo come funziona la funzione copyColumns().

  const copyColumns = () => {
    let end = false;
    let i = 2;

    while (!end) {
      i++;
      const sheetName = getColHeader(i);
      if (sheetName === -1) {
        end = true;
        break;
      } else if (sheetName) {
        const columns = oRange.GetCols(i);
        columns.ForEach((cell) => {
          copyValues(cell, sheetName, 1);
        });

        for (let j = 1; j <= 2; j++) {
          const col = oRange.GetCols(j);
          col.ForEach((cell) => {
            copyValues(cell, sheetName);
          });
        }
      } else {
        console.error("Fatal error in copy horizontal logic.");
        end = true;
        break;
      }
    }
  };

La funzione copyColumns() le colonne del foglio di lavoro corrente, a partire dalla terza colonna. Per ogni colonna, recupera l’intestazione della colonna utilizzando la funzione getColHeader(). e l’intestazione è valida, copia i valori e la formattazione di quella colonna nel foglio di destinazione specificato dall’intestazione, utilizzando la funzione copyValues().

Inoltre, garantisce che le prime due colonne, che sono considerate colonne comuni, vengano copiate in ogni foglio di destinazione. Il processo continua fino a quando non viene riscontrata un’intestazione non valida, a quel punto il ciclo termina. Questa è la funzione principale della macro e richiama altre funzioni ausiliarie.

Nota: in questo codice si presume che ci siano due colonne comuni e che le colonne specifiche da copiare separatamente in ogni foglio inizino dalla terza colonna in poi. Questi valori possono essere modificati a seconda del caso d’uso specifico.

Ora passiamo alla funzione copyValues().

const copyValues = (range, sheetName, copyType = 0) => {

La funziona copyValues() copia i valori e la formattazione dall’intervallo di origine al foglio di destinazione: range, che è l’oggetto range contenente i dati delle celle, sheetName, ovvero il nome del foglio di destinazione, e copyType, che specifica se la colonna da copiare è una colonna predefinita o una colonna specifica.

    const oValue = range.GetValue();
    const oCharacters = range.GetCharacters(0, 2);
    const oFont = oCharacters.GetFont();
    const fontName = oFont.GetName();
    const oSize = oFont.GetSize();
    const isBold = oFont.GetBold();
    const isItalic = oFont.GetItalic();
    const rowNo = range.GetRow() - 1;
    let colNo;

Innanzitutto, la funzione recupera il valore e la formattazione (nome del carattere, dimensione, grassetto, corsivo) della cella di origine.

const targetSheet = Api.GetSheet(sheetName);

    if (!targetSheet) {
      console.error(`Sheet with name ${sheetName} not found.`);
      return;
    }
    if (copyType === 1) {
      colNo = 2;
    } else {
      colNo = range.GetCol() - 1;
    }

Successivamente, il foglio di destinazione viene recuperato utilizzando la variabile sheetName, ottenuta dalla funzione getColHeader().

Se il foglio di destinazione non esiste, viene registrato un errore e l’esecuzione della macro viene interrotta.

    if (oValue === null || oValue === "") {
      targetSheet.GetRangeByNumber(rowNo, colNo).SetValue(" ");
    } else {
      oFont.SetName(fontName);
      targetSheet.GetRangeByNumber(rowNo, colNo).SetValue(oValue);
      targetSheet.GetRangeByNumber(rowNo, colNo).SetFontName(fontName);
      targetSheet.GetRangeByNumber(rowNo, colNo).SetFontSize(oSize);

      if (isBold) {
        targetSheet.GetRangeByNumber(rowNo, colNo).SetBold(true);
      }
      if (isItalic) {
        targetSheet.GetRangeByNumber(rowNo, colNo).SetItalic(true);
      }
    }
  };

Infine, se ogni cosa va a buon fine e non si verificano errori, la funzione copyValues() imposta il valore e la formattazione nella cella corrispondente del foglio di destinazione.

copyColumns();

Infine, concludiamo la macro richiamando la funzione copyColumns(), che è il punto di partenza della macro.

Il codice completo della macro

Ecco l’intero codice della macro:

(function () {
  const oWorksheet = Api.GetActiveSheet();
  const oRange = oWorksheet.GetSelection();

  const getColHeader = (colNumber) => {
    const targetColumn = oRange.GetCols(colNumber);
    const colHeader = targetColumn.GetValue()[0][0];

    return colHeader !== null && colHeader !== "" ? colHeader : -1;
  };

  const copyColumns = () => {
    let end = false;
    let i = 2;

    while (!end) {
      i++;
      const sheetName = getColHeader(i);
      if (sheetName === -1) {
        end = true;
        break;
      } else if (sheetName) {
        const columns = oRange.GetCols(i);
        columns.ForEach((cell) => {
          copyValues(cell, sheetName, 1);
        });

        // Copy the common rows in every sheet.
        for (let j = 1; j <= 2; j++) {
          const col = oRange.GetCols(j);
          col.ForEach((cell) => {
            copyValues(cell, sheetName);
          });
        }
      } else {
        console.error("Fatal error in copy horizontal logic.");
        end = true;
        break;
      }
    }
  };

  const copyValues = (range, sheetName, copyType = 0) => {
    const oValue = range.GetValue();
    const oCharacters = range.GetCharacters(0, 2);
    const oFont = oCharacters.GetFont();
    const fontName = oFont.GetName();
    const oSize = oFont.GetSize();
    const isBold = oFont.GetBold();
    const isItalic = oFont.GetItalic();
    const rowNo = range.GetRow() - 1;
    let colNo;

    const targetSheet = Api.GetSheet(sheetName);

    if (!targetSheet) {
      console.error(`Sheet with name ${sheetName} not found.`);
      return;
    }

    if (copyType === 1) {
      colNo = 2;
    } else {
      colNo = range.GetCol() - 1;
    }

    if (oValue === null || oValue === "") {
      targetSheet.GetRangeByNumber(rowNo, colNo).SetValue(" ");
    } else {
      oFont.SetName(fontName);
      targetSheet.GetRangeByNumber(rowNo, colNo).SetValue(oValue);
      targetSheet.GetRangeByNumber(rowNo, colNo).SetFontName(fontName);
      targetSheet.GetRangeByNumber(rowNo, colNo).SetFontSize(oSize);

      if (isBold) {
        targetSheet.GetRangeByNumber(rowNo, colNo).SetBold(true);
      }

      if (isItalic) {
        targetSheet.GetRangeByNumber(rowNo, colNo).SetItalic(true);
      }
    }
  };

  copyColumns();
})();

Adesso vediamo la nostra macro in azione!

Ecco fatto! Abbiamo appena dimostrato come sia possibile automatizzare anche le funzionalità più complesse utilizzando le macro di ONLYOFFICE. L’API di ONLYOFFICE è uno strumento potente, in grado di eseguire un’ampia gamma di compiti e di fornire un immenso potenziale per lo sviluppo di macro e plugin ancora più avanzati. Con questa API, gli utenti possono sfruttare tutta la potenza di ONLYOFFICE per migliorare la loro produttività e ottimizzare i loro flussi di lavoro.

Se hai domande o idee innovative, ti invitiamo a condividerle con noi. Apprezziamo il tuo contributo e non vediamo l’ora di collaborare con te. In bocca al lupo per i tuoi progetti!

 

Crea il tuo account ONLYOFFICE gratuito

Visualizza, modifica e collabora su documenti, fogli, diapositive, moduli e file PDF online.