# Alternatives to zapier

**URL:** <https://community.glideapps.com/t/alternatives-to-zapier/17827>\
**Category:** Ask for Help\
**Created:** [November 1, 2020, 5:20pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827 "2020-11-01T17:20:05Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![Thibault\_Milan](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thibault_milan/32/4970_2.png) [@Thibault\_Milan](https://community.glideapps.com/u/Thibault_Milan)\
**Post date:** [November 1, 2020, 5:20pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/1 "2020-11-01T17:20:05Z")

</div>

Hi there,  
I’m a big fan of Zapier and use it a lot, either for a personal or professional context. However, for me it’s missing two very important features:

1. Ability to delete a line, not just clear it. Especially since glide limit the number of lines on his plans.
2. Ability to delete (or even clear) multiple lines. For example, I can’t automatically clear a `cart` sheet when I insert a row into my `order` sheet

So, have you people find a solid alternative that can connect to Google Spreadsheet and do some magic here ?

---

<div class="post-metadata">

**Author:** ![Yasin\_Hassanien](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/yasin_hassanien/32/9042_2.png) [@Yasin\_Hassanien](https://community.glideapps.com/u/Yasin_Hassanien)\
**Post date:** [November 1, 2020, 6:06pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/2 "2020-11-01T18:06:27Z")

</div>

You can create a loop array create rows action then listen to it by a 2nd zap then delete a row but it won’t delete it totally it will only just clear it.

_Please read carefully the below method am using for more than 4 years already_

1. 1st zap use it to get it in a separate sheet empty one in the same spreadsheet and use the text join function with filter here below am using it to get me all the licenses that are active for a certain user filtered  
Example =textjoin(",",true,FILTER(‘License Per Company’!$B$2:$B,‘License Per Company’!$I$2:$I=6945,‘License Per Company’!$O$2:$O=“Active”))

The result will get you this example array of user IDs 9b175371,499148d6,d12edf77,2f64cc68,97296233,f533c8ee,a350a796

Sometimes I use the =Row() formula in a column so I can get the row ids normally

In the same 1st zap you will use formatted utility text to line item and separated by comma this will create for you a list of line items that you will send to a second sheet through "create spreadsheet row(s) "**Create one or more new rows in a specific spreadsheet (with line item support).**

1. Create another zap that will trigger on each row that will be added newly from the previous zap then delete it by mapping the ROWID from the previous directly to the custom row and it will clear for you the rows immediately

---

<div class="post-metadata">

**Author:** ![Jeff\_Hager](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/jeff_hager/32/43_2.png) [@Jeff\_Hager](https://community.glideapps.com/u/Jeff_Hager)\
**Post date:** [November 1, 2020, 6:12pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/3 "2020-11-01T18:12:57Z")

</div>

> [@Thibault\_Milan](#):
>
> Especially since glide limit the number of lines on his plans.

Glide will not count rows that are empty.

I don’t have experience, but I read that a lot of people are happy with Integromat.

---

<div class="post-metadata">

**Author:** ![Thibault\_Milan](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thibault_milan/32/4970_2.png) [@Thibault\_Milan](https://community.glideapps.com/u/Thibault_Milan)\
**Post date:** [November 1, 2020, 8:19pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/4 "2020-11-01T20:19:23Z")

</div>

> [@Jeff\_Hager](#):
>
> Glide will not count rows that are empty.

Oh. Then it “could” be something usable (with a bit of manual cleaning from time to time).

---

<div class="post-metadata">

**Author:** ![Manan\_Mehta](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/manan_mehta/32/13957_2.png) [@Manan\_Mehta](https://community.glideapps.com/u/Manan_Mehta)\
**Post date:** [November 1, 2020, 8:22pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/5 "2020-11-01T20:22:34Z")

</div>

Google Apps Scripts can do the job for you. [https://developers.google.com/apps-script/reference/spreadsheet/sheet](https://developers.google.com/apps-script/reference/spreadsheet/sheet)

I use it in an app to automatically delete rows when they are irrelevant.

---

<div class="post-metadata">

**Author:** ![Thibault\_Milan](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thibault_milan/32/4970_2.png) [@Thibault\_Milan](https://community.glideapps.com/u/Thibault_Milan)\
**Post date:** [November 1, 2020, 8:24pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/6 "2020-11-01T20:24:08Z")

</div>

I though about that but I only managed to have my scripts launched by a menu on the sheet, not reacting to new insert on the sheet.

---

<div class="post-metadata">

**Author:** ![Manan\_Mehta](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/manan_mehta/32/13957_2.png) [@Manan\_Mehta](https://community.glideapps.com/u/Manan_Mehta)\
**Post date:** [November 1, 2020, 8:25pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/7 "2020-11-01T20:25:45Z")

</div>

Are you talking about the triggers? I prefer to use time based triggers because OnEdit/OnChange triggers don’t work well with Glide sometimes

---

<div class="post-metadata">

**Author:** ![Thibault\_Milan](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thibault_milan/32/4970_2.png) [@Thibault\_Milan](https://community.glideapps.com/u/Thibault_Milan)\
**Post date:** [November 1, 2020, 8:32pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/8 "2020-11-01T20:32:53Z")

</div>

The thing is, in most of my scenario I would require some kind of “instant” actions.  
I was talking about the Google App Script. I tried it but didn’t find yet how to have something running on change of a row by Google App Script.

---

<div class="post-metadata">

**Author:** ![Thibault\_Milan](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thibault_milan/32/4970_2.png) [@Thibault\_Milan](https://community.glideapps.com/u/Thibault_Milan)\
**Post date:** [November 1, 2020, 8:37pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/9 "2020-11-01T20:37:13Z")

</div>

So you’re idea is to have a _utility_ sheet which store by any mean the row IDs to delete and use a trigger on that sheet, when a new row, use the content (which is the other sheet row id) to delete the row.

I definitly need to give a try, that’s a nice work around !

---

<div class="post-metadata">

**Author:** ![Thibault\_Milan](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thibault_milan/32/4970_2.png) [@Thibault\_Milan](https://community.glideapps.com/u/Thibault_Milan)\
**Post date:** [November 2, 2020, 6:04pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/10 "2020-11-02T18:04:25Z")

</div>

Just wanted to share the google script I made to answer the need I exposed before

```auto
/**
 * Find the email for a client order
 * @param {Event} e The onEdit event
 * return {String} The email of the client
 */
function getClientEmail(e) {
  return e.range.getCell(1,2).getDisplayValue();
}

/**
 * Find all the lines in cart for this email
 * @param {String} email The client's email
 * return {Array} of Range
 */
function getCartLines(email) {
  Logger.log(email);
  // Get the correct Sheet to search
  var cartSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Panier");
  // Get all occurences of email
  var found = cartSheet.getRange(1,1,cartSheet.getLastRow()).createTextFinder(email).matchCase(false).findAll();
  // return the lines (it's range element actually)
  return found;
}

/** Delete the row of that range
 * @param {Range} the row to delete
 */
function deleteLine(range) {
  var rowNumber = range.getRow();
  range.getSheet().deleteRow(rowNumber);
}

/**
 * The event handler triggered when editing the spreadsheet.
 * @param {Event} e The onEdit event.
 */
function onEdit(e) {
  // prevent execution on any other sheet than Commandes
  if (e.source.getActiveSheet().getName() != "Commandes")return;
  // Try to get client email, if unsuccessfull, exit.
  var client = getClientEmail(e);
  if (client == null) return;
  // Try to get Cart for the client, then reverse the array to start deleting by the end of the pile
  var lines = getCartLines(client).reverse();
  if (lines == null) return;
  // Iterate over each line and delete them
  lines.forEach(line => deleteLine(line));
  // Set a comment on the edited cell to indicate when it was changed.
  e.range.getCell(1,1).setNote(lines.length + ' lines of cart deleted');
}

```

This is a simple Trigger and it will **NOT** work when glide is making API call and insert struff in the sheet. My next move is to use [installable trigger](https://developers.google.com/apps-script/guides/triggers/installable) and publish my code (I think it’s require Google approves it before you can “install” it on your sheet) to be able to catch insertion by API 😃

---

<div class="post-metadata">

**Author:** ![Jeff\_Hager](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/jeff_hager/32/43_2.png) [@Jeff\_Hager](https://community.glideapps.com/u/Jeff_Hager)\
**Post date:** [November 2, 2020, 6:23pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/11 "2020-11-02T18:23:56Z")

</div>

The easiest is to just add an onChange trigger through google scripts. This will trigger any time data comes from glide or something in the sheet changes. I have used this in the past as well as some time based triggers. It’s a pretty simple process to set up.

![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/2X/0/023e8ffddc8854c3a78ee995775e1bcc8e9f0b59.png)

---

<div class="post-metadata">

**Author:** ![Thibault\_Milan](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thibault_milan/32/4970_2.png) [@Thibault\_Milan](https://community.glideapps.com/u/Thibault_Milan)\
**Post date:** [November 2, 2020, 10:05pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/12 "2020-11-02T22:05:55Z")

</div>

Except I have a big error screen from Google ☹ Saying my app is unverified so Google login is deactivated.

 ![Capture d’écran 2020-11-02 à 23.03.00](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/2X/7/7e30056f26abef4c44679a9216508b85b6d22e67.png)

---

<div class="post-metadata">

**Author:** ![Jeff\_Hager](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/jeff_hager/32/43_2.png) [@Jeff\_Hager](https://community.glideapps.com/u/Jeff_Hager)\
**Post date:** [November 2, 2020, 10:51pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/13 "2020-11-02T22:51:25Z")

</div>

That should be fine. A new trigger will usually need authorization from you to run on your behalf and since it’s not a verified app, you just need to override it anyway since you are the developer. This should have been presented to you somewhere when creating a new trigger.

Did you go through these steps when setting up the trigger?

 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/2X/e/ece27fba163c505318887ad4bcde6e8dd18b82fc.png)

 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/2X/1/11502e7907e83dccf09b744633efd0fe34fcef2c.png)

 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/2X/9/9a2476f42b82fef0535e876c3e041c3441c08171.png)

---

<div class="post-metadata">

**Author:** ![Thibault\_Milan](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thibault_milan/32/4970_2.png) [@Thibault\_Milan](https://community.glideapps.com/u/Thibault_Milan)\
**Post date:** [November 3, 2020, 2:22pm UTC](https://community.glideapps.com/t/alternatives-to-zapier/17827/14 "2020-11-03T14:22:30Z")

</div>

I realised I need to move the script for the default environment and create an app to in GCP do get the Oauth working 😄  
Now it’s done, I can see that `onChange` event doesn’t get the `range` so I have no clue about what data have been modified which I had with `enEdit` (but which don’t work with Glide insertions).

Also, the `changeType` for Glide is `EDIT` and not `INSERT_ROW`… which don’t help. I could have imagine getting the last row when I’m sure it’s an `INSERT_ROW` event but with just `EDIT` … Could be anything.
