как запускать скрипты приложения на мобильном устройстве, один скрипт работает, другой не работает - PullRequest
0 голосов
/ 23 апреля 2020

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

function onEdit(e){
const rg = e.range;
if(rg.getA1Notation() === "C30" && rg.isChecked() && rg.getSheet().getName() === "pad no 1"){
loopThroughQuantity();  //loopThroughQuantity is a function name
rg.uncheck();
}
}

, теперь у меня есть две функции, одна работает правильно как в мобильной, так и в настольной версии листов Google, но другая функция не работает как в настольной, так и в мобильной версии через флажок, ниже находится первая функция, которая работает

function loopThroughQuantity(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var bill = ss.getSheetByName("pad no 1");
var billdata=bill.getRange(8, 1, 27, 6).getValues();
var sheet = ss.getSheetByName("stock");
var range = sheet.getDataRange();
var stock = range.getValues();
for (var i=0; i<billdata.length;i++){
var q = billdata[i][5];
var desc = billdata[i][1];
    for( var j=0; j<stock.length; j++ ) {
      if( stock[j][0] === desc ) {
        range.offset(j,2,1,1).setValue(q);
      }
    }
  }
 }

, в то время как другой код ниже, который не работает при нажатии флажка

function runBothfunctions(){
//function 1
var ss = SpreadsheetApp.getActiveSpreadsheet()
var ss1 = ss.getSheetByName('pad no 1')
var ss1Id = ss1.getSheetId()
var ss2 = ss.getSheetByName('bill list')
var ssId = ss.getId()
var clientName = ss1.getRange(3,3).getValue()
var invoiceNumber = ss1.getRange(4,3).getValue()
var totalBill = ss1.getRange(29,9).getValue()
var d = new Date();
var fullDate = ('0' + d.getDate()).slice(-2) +"/"+ ('0' + (d.getMonth() +1)).slice(-2) +"/"+ 
(d.getYear().toString()).slice(-2)
var invoiceFileName = invoiceNumber + '_' + fullDate + '_' + clientName +'_'+ totalBill

var url = ss.getUrl()
url = url.replace(/edit$/,'')
var url_ext = 'export?exportFormat=pdf&format=pdf'
+ '&size=A4'                           // paper size: "legal" / "letter" / "A4"
+ '&fitw=true'                         // fit to width, false for actual size
+ '&sheetnames=false&printtitle=false' // hide optional headers and footers
+ '&gridlines=false'                   // hide gridlines
+ '&gid=' + ss1Id                      // the sheet's Id

var token = ScriptApp.getOAuthToken()  
// Convert sheet1 to PDF
var response = UrlFetchApp.fetch(url + url_ext, { headers: { 'Authorization': 'Bearer ' +  token }})

var blob = response.getBlob().setName(invoiceFileName + '.pdf')  
// Add the folder ID of the Drive folder where the PDF should be saved. Create a folder and copy this 
ID: www.goo.gl/TfgqrN
var invoiceURL = 
DriveApp.getFolderById('1I8NvoAERa_NxgS3z5jmYCC8TOlejDHNT').createFile(blob).getUrl()
ss2.getRange(ss2.getLastRow() +1, 1).setFormula('=HYPERLINK("' + invoiceURL + '";"' + invoiceFileName 
+ '")')

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

var lastRow = sheet.getLastRow();
var lastColumn = sheet.getLastColumn();

//create an array of the invoice numbers already created 
var colArray = sheet.getRange(4, 3).getValues();

//sort the array values to find max
var maxInColumn = colArray.sort(function(a,b){return b-a})[0][0];

var nextCell = sheet.getRange(4, 3);

//assign the max+1 to the next entry
nextCell.setValue(maxInColumn+1);

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Unwanted Sheet');

DriveApp.createFile(ss.getBlob());

//function 2
 var sheet = SpreadsheetApp.getActive().getSheetByName('pad no 1');
sheet.getRange('B8:F28').clearContent();
sheet.getRange('h8:h28').clearContent();
sheet.getRange('C3').clearContent();




//function 3
//below code is for subtracting sold quantity from old quantity
var sheet = SpreadsheetApp.getActive().getSheetByName('stock');

var maxRows = sheet.getMaxRows();

var soldRange = sheet.getRange(2, 3, maxRows); // row, column, number of rows
var totalRange = sheet.getRange(2, 2, maxRows);

var soldValues = soldRange.getValues();
var totalValues = totalRange.getValues();
for (var row in soldValues) {
var soldCellData = soldValues[row][0];
var totalCellData = totalValues[row][0];

if (soldCellData !== "" && totalCellData !== "") {
  totalValues[row][0] = totalCellData - soldCellData;
  soldValues[row][0] = "";
 } 
}

soldRange.setValues(soldValues);
totalRange.setValues(totalValues);


var sheet = SpreadsheetApp.getActive().getSheetByName('pad no 1');
sheet.getRange('c3').setValue('Make Your Next Bill');
 //sheet.getRange('c3').activate();  


//function 4
//var ui = SpreadsheetApp.getUi()
//var response = ui.alert('bill saved and cleared  ?');


}

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

1 Ответ

0 голосов
/ 23 апреля 2020

Мне кажется, что вы перегружаете свою onEdit(e) функцию.

Посмотрите на Простые ограничения триггеров

Выполнение сценариев и запросы API не запускайте триггеры.

, в вашем случае

Они не могут получить доступ к службам, требующим авторизации.

, в вашем случае тоже

По этой причине onEdit(e) не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...