Я настроил функцию для вызова 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();
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.2021bitlystats
и другую вашу функцию:I have set up a trigger for BitlyStats to update overnight, and then to run the append function
. - person Iamblichus   schedule 11.03.2021function 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.2021bitlink_url
, я мог бы более точно рассказать о решении. В любом случае, надеюсь, это будет вам полезно. - person Iamblichus   schedule 12.03.2021it 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.2021bitlyStats
как пользовательскую функцию в ячейке B (как показано на снимке экрана в моем исходном сообщении), которая ссылается на ячейку A рядом с ней. Как я могу избежать передачи его в качестве параметра? - person racker   schedule 16.03.2021bitlyStats
с помощью триггера, основанного на времени, не приведет к обновлению настроенных вами пользовательских функций. Можете ли вы предоставить более подробную информацию о том, почему вы хотите запускать это с помощью триггера, основанного на времени, и, особенно, где в вашем коде (если где-либо) вы ссылаетесь наbitlink_url
, который, как вы думали, передается в качестве параметра? - person Iamblichus   schedule 16.03.2021B
новыми счетчиками, вы можете избавиться от пользовательских функций и изменитьbitlyStats
, чтобы получать все URL-адреса, вычислять счетчики и записывать их в свой лист. Если это ваша цель, я бы хотел отредактировать свой ответ, подробно объяснив, как это сделать. - person Iamblichus   schedule 16.03.2021