Einfache Slack App zum Veröffentlichen von Inhalten aus Google Sheets

Wir probieren gerne neue Dinge aus und teilen daher häufig Links zu interessanten Informationen aus der IT- und Programmierwelt mit unseren Kollegen. Wir sind langjährige Nutzer von Slack und für solche Links haben wir einen separaten Bildungskanal, in dem jeder etwas Interessantes für sich finden kann. Aber da wir normale Menschen sind, die sich regelmäßig in der Hitze der Arbeit befinden, vergessen wir, dass wir diese Verbindungen teilen müssen, und die Aktivität im Kanal schwindet, obwohl viele von uns etwas zu teilen haben.

Wir standen vor einer interessanten Aufgabe, einen „Bot“ zu entwickeln, der automatisch vorab gesammelte Informationen aufnimmt und regelmäßig Links dazu teilt. Wir suchten nach einer vorgefertigten Lösung im Internet, und jetzt ist sie als Integration von Zapier und Slack erschienen .

Bild

Eine solche Integration haben wir jedoch vorher nicht gefunden und beschlossen, unser eigenes kleines Fahrrad zu schreiben. Im Folgenden werden wir beschreiben, wie genau wir es gemacht haben.

Beim Nachdenken über das Problem kam mir folgende Lösung in den Sinn:
Javascript-Code, der Informationen zu relevanten nützlichen Links aus der Google-Tabelle empfängt und an Slack sendet. Aufrufen eines Skripts vom ersten Element eines Zeitplans mit cron. Fangen wir in der richtigen Reihenfolge an.

Ein Token für Slack bekommen.


Hier ist alles einfach und wurde in anderen Artikeln wiederholt beschrieben, daher werde ich nur eine kurze Beschreibung geben.

Es gibt zwei Möglichkeiten: Erstellen Sie Ihre eigene Slack-Anwendung oder verwenden Sie ältere Token. Die erste Option ist etwas komplizierter, wird jedoch von Slack empfohlen. Die zweite Option ist einfacher und für unsere Anforderungen gut geeignet, da wir sie aufgrund ihrer Einfachheit auswählen werden.

Wir öffnen einen Link, um ein neues Token zu generieren und ein neues Token für den gewünschten Arbeitsbereich zu erstellen (vergessen Sie nicht, es zu kopieren, das Token wird einmal ausgestellt).

Bild

Wenn wir in Zukunft Code implementieren, der mit der Slack-API und Google Sheets interagiert, können wir dieses Token für den beabsichtigten Zweck verwenden.

Jetzt müssen Sie das Token für Google Sheets erhalten. Öffnen Sie zunächst Node.js Quickstart für Google Sheetsund aktivieren Sie die Google Sheets-API. Dann kopieren wir den Code index.js aus dem Beispiel und führen ihn aus, durchlaufen den Autorisierungsprozess und erhalten die Anmeldeinformationen in der Datei, die für die Verwendung mit unserem Skript nützlich sind.

Skriptimplementierung


Jetzt ist es an der Zeit, ein Skript zum Veröffentlichen von Nachrichten von Google Sheets an Slack zu entwickeln. Den vollständigen Skriptcode finden Sie, indem Sie auf den Link klicken .

Zunächst analysieren wir den Teil des Codes, der Nachrichten an den Slack-Kanal sendet.
Dies geschieht durch Aufrufen der Slack REST-API.

const post = async (text, channel = <CHANNEL ID>) => {
  const uri = `https://slack.com/api/chat.postMessage?token=${SLACK_AUTH_TOKEN}&channel=${channel}&text=${text}`;
  const result = await fetch(encodeURI(uri), {
    headers: {
      'Content-Type': 'application/json',
    },
    method: 'POST',
    body: JSON.stringify({
      channel,
      text,
      as_user: true
    })
  });

  await result.json();
};

Für die Autorisierung in der Google-API werden zwei Funktionen verwendet (authorize, getNewToken), deren Code aus Node.js Quickstart stammt. Wir werden nicht näher darauf eingehen.

Der nächste interessante Codeblock besteht darin, Informationen aus Google-Tabellen zu senden. Dies erfolgt mithilfe der folgenden Funktion:

const getMessageAndPost = async (auth, spreadsheetId = <ID  Google >) => {
  const sheets = google.sheets({ version: 'v4', auth });
  sheets.spreadsheets.values.get({
    spreadsheetId,
    range: 'Sheet1!A1:B999',
  }, async (err, res) => {
    if (err) return console.log('The API returned an error: ' + err);
    const rows = res.data.values;
    if (rows.length) {
      // Print columns A and E, which correspond to indices 0 and 4.
      const ix = rows.findIndex(r => !r[1]);
      await post(rows[ix][0]);
      sheets.spreadsheets.values.update({
        spreadsheetId: '18VzilQTEDGXBnaH1f_k-uAfa8Mb470gx32Phir6xQT4',
        range: `Sheet1!B${ix + 1}`,
        valueInputOption: 'RAW',
        requestBody: {
          range: `Sheet1!B${ix + 1}`,
          values: [['x']]
        }

      })
    } else {
      console.log('No data found.');
    }
  });
};

Die Tabelle, mit der das Skript interagiert, hat die folgende Form:

Bild

Dementsprechend setzt das Skript für jeden Link nach dem Senden einer Nachricht an Slack "x". Um die Nachricht zu finden, die Sie senden möchten, sollten Sie die erste Zeile auswählen, die noch kein „x“ hat, die Nachricht aufnehmen, senden und die ausgewählte Zeile markieren.

Das Skript, das wir gerade zerlegt haben, ist recht einfach und hat seine Leistung seit mehreren Jahren in unserem Team bestätigt. Wir müssen dieses Skript nur auf dem Server bereitstellen und es gerne verwenden.

Dafür verwenden wir in unserem Unternehmen das übliche Ubuntu VPS auf Digital Ocean (selbst das mit dem geringsten Stromverbrauch).

Zunächst müssen Sie die Umgebung für die Ausführung von Javascript-Code konfigurieren. Dazu müssen Sie node.js (Installationsanleitung )

Konfigurieren Sie anschließend die Cron-Task so, dass das Skript nach einem Zeitplan aufgerufen wird:

crontab -e

#### 

24 14 * * 1-5 cd /root/google-sheets-to-slack && node post.js

Mit diesen Einstellungen wird unser Skript aus dem Ordner / root / täglich von Montag bis Freitag um 14:24 Uhr aufgerufen.

Das Setup ist beendet, aber der aufmerksame Leser muss einige Fehler im Skript bemerkt haben. Wenn beispielsweise beim Aufrufen des Skripts ein Fehler auftritt, werden wir nie davon erfahren, da es "leise herunterfällt" und das ist alles. Um dieses Problem zu lösen, können Sie die Fehlerbehandlung und Ausgabe des Ergebnisses des Skriptaufrufs derselben Google-Tabelle oder Protokolldatei hinzufügen.

Anstatt eine Nachricht zu einem festgelegten Zeitpunkt zu senden, können Sie sie auch mit einer zufälligen Verzögerung senden, sodass unsere Nachricht eher einer Nachricht eines "Live" -Benutzers ähnelt.

Eine weitere interessante Idee eines unserer Kollegen war es, eine zweite Tabelle zu erstellen, von der aus Nachrichten ausschließlich freitags gesendet werden und die unterhaltsamer ist.

Im Allgemeinen sehen wir unzählige Ideen zur Verfeinerung und werden sie schrittweise umsetzen, aber in der vorhandenen Form war dieses Skript durchaus brauchbar.

Eine Beispieltabelle, die verwendet werden kann, finden Sie hier .

Vielen Dank fürs Lesen und viel Spaß beim Verwenden.

All Articles