Сбой триггера ежедневного расписания скрипта Google Apps

Я настроил функцию для вызова Bitly API для отслеживания общего количества кликов по моим ссылкам. Он настроен в столбце для отслеживания кликов по каждой отдельной ссылке. Он отлично обновляется каждый раз, когда я открываю электронную таблицу.

введите описание изображения здесь

Вот код для этого

function bitlyStats(bitlink_url) {
  var bitlink_url_parts = bitlink_url.split('://');
  var bitlink = bitlink_url_parts[1];
  var accessToken = 'token';
  var fetchUrl = 'https://api-ssl.bitly.com/v4/bitlinks/' + bitlink + '/clicks/summary?unit=day&units=1';
  var headers = {
    'Authorization': 'Bearer '+ accessToken,
    'Content-Type': 'application/json',
  };
  var params = {
    'method' : 'get',
    'headers' : headers,
    'muteHttpExceptions' : true
  };
  var response = UrlFetchApp.fetch(fetchUrl, params);
  var clickCount = JSON.parse(response).total_clicks;
  return clickCount;
}

Я настроил вторую функцию, чтобы каждый день добавлять эти результаты на вторую вкладку листа. Я настроил триггер для BitlyStats, чтобы он обновлялся за ночь, а затем запускал функцию добавления. Однако я получаю сообщение об ошибке триггера для BitlyStats ..

TypeError: bitlink_url.split не является функцией на bitlyStats (BitlyStats: 10: 39)

Это заставляет функцию добавления копировать #NAME? в каждой ячейке второй вкладки. Я не уверен, почему возникает ошибка, когда функция работает найти при открытии?

Любой совет будет очень признателен! Спасибо.

ИЗМЕНИТЬ. После некоторой обратной связи и потенциального ответа становится ясно, что триггер, основанный на времени, не будет работать с функцией, которая ссылается на то, что вводится в ячейку. Теперь я пытаюсь создать функцию вызова API для bitlink_url, чтобы она создавала список битовых ссылок вместо списка, уже находящегося на листе.

Однако у меня возникают проблемы с новым кодом, я буду благодарен за любые советы. Я все еще новичок в этом. Спасибо! Это справочное руководство, которое я использую https://dev.bitly.com/api-reference#getBitlinksByGroup

Журнал показывает ноль

function getBitly() {
  var accessToken = 'x'; //access token
  var groupID = 'x' ; //group ID
  var fetchUrl2 = 'https://api-ssl.bitly.com/v4/groups/' + groupID + '/bitlinks?size=10';
  var headers = {
    'Authorization': 'Bearer '+ accessToken,
    'Content-Type': 'application/json',
  };
  var params = {
    'method' : 'get',
    'headers' : headers,
    'muteHttpExceptions' : true
  };
  var response2 = UrlFetchApp.fetch(fetchUrl2, params);
  var bitlinkList = JSON.parse(response2).link;
  Logger.log(bitlinkList);

## EDIT2 - решено ## Благодаря @lamblichus я смог пересмотреть код и решить проблему необходимости ссылаться на каждую ячейку, в которой был сохранен URL-адрес Bit.ly, с помощью функции карты. Окончательный код ниже. Я также включил код добавления значений в ту же функцию.

function getStats() {
  var sheet = SpreadsheetApp.getActive().getSheetByName("VV Bitly Links");
  var bitlyurls = sheet.getRange(2,12,sheet.getLastRow()-1).getValues().flat();
  var clickCounts = bitlyurls.map(bitlink => [bitlyStats2(bitlink)]);
  sheet.getRange(2,6,clickCounts.length).setValues(clickCounts);
  var sheet2 = SpreadsheetApp.getActive().getSheetByName("Bitly Reporting");
  var data = sheet.getRange(2,6,sheet.getLastRow()-1,6).getValues();
  var lastrow = sheet2.getLastRow();
  sheet2.getRange(lastrow+1,1,data.length,data[0].length).setValues(data);
}

function bitlyStats2(bitlink) {
  var accessToken = 'xx'; //token
  var fetchUrl = 'https://api-ssl.bitly.com/v4/bitlinks/' + bitlink + '/clicks/summary?unit=day&units=1';
  var headers = {
    'Authorization': 'Bearer '+ accessToken,
    'Content-Type': 'application/json',
  };
  var params = {
    'method' : 'get',
    'headers' : headers,
    'muteHttpExceptions' : true
  };
  var response = UrlFetchApp.fetch(fetchUrl, params);
  var clickCount = JSON.parse(response).total_clicks;
  return clickCount;
}

function installTrigger() {
  ScriptApp.newTrigger("getStats")
  .timebased()
  .atHour(3)
  .everyDays(1)
  .create();
}

наконец, поскольку здесь упоминается множество ссылок Bit.ly, некоторые из которых больше не активны и возвращают 0 кликов в день, я создал другую функцию для удаления пустых ячеек со второй вкладки "Bitly Reporting"

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName("Bitly Reporting");
var range = sh.getDataRange();
var delete_val = ""
var col_to_search = 1;
function deleteEmptys(){
  var rangeVals = range.getValues();
  for (var i = rangeVals.length-1; i >=0; i--){
    if(rangeVals[i][col_to_search] === delete_val){
      sh.deleteRow(i+1);
    };
  };
};

function installTrigger2() {
  ScriptApp.newTrigger("deleteEmptys")
  .timebased()
  .atHour(5)
  .everyDays(1)
  .create();

person racker    schedule 10.03.2021    source источник
comment
Могу я спросить вас о деталях a second function из I've set up a second function to append these results to a second tab in the sheet each day.?   -  person Tanaike    schedule 11.03.2021
comment
Можете ли вы предоставить код, связанный с этой второй функцией, а также с функцией, вызываемой временным триггером? Если я вас правильно понял, триггер выполняет функцию, которая включает bitlystats и другую вашу функцию: I have set up a trigger for BitlyStats to update overnight, and then to run the append function.   -  person Iamblichus    schedule 11.03.2021
comment
Не беспокойтесь, вот функция добавления кода. Я настроил триггеры для запуска функций bitlyStats и appendValues, которые будут запускаться ночью function clickhistory() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet1 = ss.getSheetByName("VV Bitly Links"); var sheet2 = ss.getSheetByName("Bitly Reporting"); var data = sheet1.getRange(2,6,sheet1.getLastRow()-1,6).getValues(); var lastrow = sheet2.getLastRow(); sheet2.getRange(lastrow+1,1,data.length,data[0].length).setValues(data); }   -  person racker    schedule 12.03.2021
comment
Каждое утро я проверяю вкладку Bitly Reporting, к которой добавлены значения, и все новые ячейки были добавлены с #NAME? в каждой ячейке. Если я запускаю функции вручную каждый день, они работают отлично. Это как-то связано с триггером в одночасье.   -  person racker    schedule 12.03.2021
comment
Привет, я опубликовал ответ. Если вы предоставите дополнительную информацию о том, как вы получаете bitlink_url, я мог бы более точно рассказать о решении. В любом случае, надеюсь, это будет вам полезно.   -  person Iamblichus    schedule 12.03.2021
comment
it is clear that the time based trigger wont work with a function that references what is input in the cell Это не обязательно так. Просто вы не можете передать его как параметр, но вы можете получить его изнутри функции. Вероятно, это было бы проще, чем то, что вы пытаетесь сделать сейчас. Не могли бы вы предоставить более подробную информацию о том, как вы получаете bitlink_url, когда запускаете это вручную? Используете ли вы bitlyStats в качестве пользовательской функции? Если вы проясните это, я хотел бы отредактировать свой ответ, чтобы адаптировать его к вашим потребностям.   -  person Iamblichus    schedule 15.03.2021
comment
Спасибо, @lamblichus, извините за смущение. Я настроил автоматизацию Zapier, поэтому каждый раз, когда создается новая битовая ссылка, она рекламирует ссылку bit.ly.xxxxx в свой лист Google в столбце A. Я использую bitlyStats как пользовательскую функцию в ячейке B (как показано на снимке экрана в моем исходном сообщении), которая ссылается на ячейку A рядом с ней. Как я могу избежать передачи его в качестве параметра?   -  person racker    schedule 16.03.2021
comment
Не уверен, знаете ли вы об этом, но выполнение bitlyStats с помощью триггера, основанного на времени, не приведет к обновлению настроенных вами пользовательских функций. Можете ли вы предоставить более подробную информацию о том, почему вы хотите запускать это с помощью триггера, основанного на времени, и, особенно, где в вашем коде (если где-либо) вы ссылаетесь на bitlink_url, который, как вы думали, передается в качестве параметра?   -  person Iamblichus    schedule 16.03.2021
comment
Если вы просто хотите периодически обновлять столбец B новыми счетчиками, вы можете избавиться от пользовательских функций и изменить bitlyStats, чтобы получать все URL-адреса, вычислять счетчики и записывать их в свой лист. Если это ваша цель, я бы хотел отредактировать свой ответ, подробно объяснив, как это сделать.   -  person Iamblichus    schedule 16.03.2021
comment
Спасибо @lamblichus, да, я хочу, чтобы столбец B (в настоящее время использующий bitlyStats) обновлялся ежедневно, чтобы затем я мог добавить значения во вторую вкладку. Эта вкладка используется в отчете студии данных. Я знаю, что есть способ вызвать список ссылок Bitly через API, и это было то, что я пытался сделать с моим дополнительным кодом. Любые советы здесь будут оценены. Спасибо.   -  person racker    schedule 17.03.2021
comment
Привет, рейкер, я обновил свой ответ, дайте мне знать, работает ли это для вас.   -  person Iamblichus    schedule 17.03.2021


Ответы (1)


Проблема:

Вы не можете передавать параметры функции, запускаемой с помощью триггера, управляемого по времени. Из-за этого bitlink_url не определено, поэтому bitlink_url.split('://') выдает ошибку.

Решение:

  • Либо настройте параметр по умолчанию для bitlyStats:
function bitlyStats(bitlink_url = "YOUR_URL") {
  • Или вызовите функцию-оболочку в своем триггере, чтобы было определено bitlink_url:
function timeTriggeredFunction() {
  var bitlink_url = "YOUR_URL";
  bitlyStats(bitlink_url);
}

Обновлять:

У вас есть ряд URL-адресов в столбце A, и вы хотите периодически обновлять столбец B на основе этих URL-адресов (используя bitlyStats).

В этом случае я бы посоветовал не использовать пользовательские функции, которые нельзя вызвать с помощью триггера, управляемого по времени, но установите триггер, который будет вызывать функцию (названную triggeredFunction в приведенном ниже примере), которая:

  • Получите URL-адреса из столбца A.
  • Для каждого URL получите его clickCounts, используя bitlyStats.
  • Запишите полученный clickCounts в столбец B.

Пример кода:

function triggeredFunction() {
  var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");
  var bitlink_urls = sheet.getRange(2,1,sheet.getLastRow()-1).getValues().flat();
  var clickCounts = bitlink_urls.map(bitlink_url => [bitlyStats(bitlink_url)]);
  sheet.getRange(2,2,clickCounts.length).setValues(clickCounts);
}

function installTrigger() {
  ScriptApp.newTrigger("triggeredFunction")
  .timeBased()
  .atHour(3)
  .everyDays(1)
  .create();
}

Примечание:

  • В приведенном выше примере триггер, управляемый по времени, устанавливается программно запустив installTrigger один раз, и при этом triggeredFunction будет запускаться каждый день с 3 до 4 часов утра. Вы также можете установить его вручную и изменить настройки триггера в соответствии с к вашим обстоятельствам.
  • В приведенном выше примере предполагается, что лист с данными называется Sheet1. Измените это, если это не так.
person Iamblichus    schedule 12.03.2021
comment
Спасибо @lamblichus за потенциальный ответ. Поскольку у меня есть длинный список битовых ссылок, по которым я должен сообщать ежедневно, создание переменных для каждой ссылки займет слишком много времени. Я отредактировал свой исходный пост, включив в него новый код, над которым я работаю, если у вас есть совет, как это сделать. Спасибо! - person racker; 15.03.2021
comment
@racker У вас сработало обновление? - person Iamblichus; 22.03.2021
comment
Да, спасибо! Мне пришлось немного изменить код, но я заставил его работать, я опубликую свой последний код в теле вопроса в качестве редактирования. - person racker; 23.03.2021