=COUNTIFS(A2:A9,"=Яндекс.Такси",B2:B9,"=Стоимость")
Authorizing Your App with Google Drive
All requests to the Google Drive API must be authorized by an authenticated user. Google Drive uses the OAuth 2.0 protocol for authenticating a Google account and authorizing access to user data. You can also use OAuth 2.0 or Google+ Sign-in to provide a "sign-in with Google" authentication method for your app #REF
function doPost(e){
var response = {};
try {
var sheet = SpreadsheetApp.openById('1iZazQ8YSMa6b9WFKTHJ99WooEC48nH9IF1x9fh6dQ9Y');
sheet.appendRow([new Date(), JSON.stringify(e)]);
response = {'result': 'OK'};
} catch(err) {
response = {'error': 'error'};
} finally {
return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
}
}
setValue()
, да еще и во вложенном цикле. Запись происходит не на ваш ПК, а на сервер. Кому понравится, когда его так дергают?setValue()
.function writeData(){
//Не факт, что поможет, но вдруг
SpreadsheetApp.flush();
//Далее как у всех
var ss = SpreadsheetApp.getActiveSpreadsheet();
var resultSheet = ss.getSheetByName("Result");
var agentsSheet = ss.getSheetByName("Buyers");
var productsSheet = ss.getSheetByName("Products");
var aV = agentsSheet.getDataRange().getValues();
var pV = productsSheet.getDataRange().getValues();
//срезать шапку
aV.shift();
// pV.shift();
var res = [];
for(var i = 0; i< aV.length; i++)
{
res.push([].concat([aV[i][0]], pV[0]));
for(var j = 1; j < pV.length; j++){
res.push([].concat([''], pV[j]));
}
}
res = res.slice(0, 50000);
resultSheet.getDataRange().clear();
resultSheet.getRange(1, 1, res.length, res[0].length).setValues(res);
}
Обновление от 2019-01-23
Существует возможность "привязать" Таблицу к Документу. Необходимо выделить диапазон Таблицы, скопировать в буфер и вставить в Документ. Пример https://vk.com/wall-174824632_8
function sheetName() {
return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
}
function sheetsName() {
return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(function(s){return s.getName()});
}
=sheetName(E5:E13)
=sheetsName(E5:E13)
E5:E13
особый, обязательно активный, т.е. зависящий от ввода пользователя, диапазон. Без изменения этого диапазона, толку от функции будет мало.=QUERY('История'!B:E;"select B, C, sum(D) where E=true group by B, C")
'C:\phantomjs\bin'
'C:\Диск Google\FOLDER'
var folder = 'C:\\_\\Google Drive\\temp (main)\\(public)\\';
var folder = 'C:\\Диск Google\\FOLDER\\';
'C:\phantomjs\bin\phantomjs.exe parse_jsp_to_file.js'
document.getElementByTagName('img').src = data.image;
<div>
<input type="button" onclick="showImage()" value="Click Me!" />
<div id="app"></div>
</div>
<script>
function showImage() {
google.script.run.withSuccessHandler(doStuff).withFailureHandler(function serverFailureHandler(e) {
console.log(JSON.stringify(e))
}).getImageId();
};
function doStuff(id) {
var img = document.createElement('img');
img.src = 'https://drive.google.com/uc?export=download&id=' + id;
document.getElementById('app').appendChild(img);
};
</script>
function doGet(e){
return HtmlService.createHtmlOutputFromFile('index');
}
function getImageId(){
return '0BzStSAirQJ2oREZGYnM5MjBUZTQ';
}
<?!= include('JavaScript'); ?>
function doGet(e){
return HtmlService.createHtmlOutputFromFile('index');
}
function test(){
Logger.log(toMD5('56'));
}
const toMD5 = function(charset, toByte) {
charset = charset || Utilities.Charset.UTF_8;
var digest = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, this, charset);
if(toByte) return digest;
var __ = '';
for (i = 0; i < digest.length; i++) {
var byte = digest[i];
if (byte < 0) byte += 256;
var bStr = byte.toString(16);
if (bStr.length == 1) bStr = '0' + bStr;
__ += bStr;
}
return __;
}
=REGEXMATCH(T(A1),"7777|9999")
=ARRAYFORMULA(REGEXMATCH(T(A1:A12),"7777|9999"))
T()
можно опустить.