SpreadsheetApp.getActiveSpreadsheet();
В триггере OnFormSubmit
не может быть активной Таблицы, потому что никакой пользователь ее не открыл. А если даже и открыл, то он может не быть регистратором триггера или его инициатором./**
* В Таблице должен быть лист "Лог".
* Чтобы лист существовал всегда
* https://github.com/oshliaer/google-apps-script-snippets#get-a-sheet-by-name
**/
function handler(e) {
try {
sendFormByEmail(getNewEmailMessage(e));
} catch(err) {
e.source.getSheetByName('Лог').appendRow([new Date(), err.message, err.stack]);
}
}
e.source.getSheetByName()
. Это все, что надо./**
* Определение языка на основе ответа
**/
function getNewEmailMessage(e) {
var sheet = e.range.getSheet();
var lang = 'EN';
switch(sheet.getName()){
case 'RU':
return 'Ответ на русском';
break;
case 'EN':
return 'Ответ на нерусском';
break;
}
return 'Ответ на русском';
}
sendFormByEmail
согласно принимаемым параметрам.This method requires authorization with an OAuth 2.0 token that includes at least one of the scopes listed in the Authorization section; script projects that do not require authorization cannot be executed through this API.
POST https://script.googleapis.com/v1/scripts/{scriptId}:run
{scriptId}
- это уникальный номер самого скрипта, который находится в меню Файл - Свойства проекта - Ключ проектаfunction doPost(e) {
return ContentService.createTextOutput(JSON.stringify({status: 'ok'}))
.setMimeType(ContentService.MimeType.JSON);
}
=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")