如果共享电子表格,则电子表格脚本不会运行

时间:2018-04-20 14:30:31

标签: javascript google-apps-script google-sheets

我正在处理一个脚本,该脚本会从大型数据库中复制一行,这样就可以更容易地进行修改。

重点是允许更多编辑器并行修改数据库。但是,如果我共享电子表格,其他用户会收到以下错误: 脚本...遇到错误。用户仅通过分配给按钮的脚本遇到此问题。 onEdit()运行得很好。

这是我的第一个google脚本文件,所以我真的不知道问题是什么以及我该如何解决它。

整个代码在这里:

//copy the chosen row to the appropriate cells of the editor sheet
//if zero sets the cells to default
function copySelectedRow(){ 
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var shData=ss.getSheets()[0];
  var shEdit=ss.getActiveSheet();
  var idNumber = shEdit.getRange(1,2).getValue();

  if(idNumber == 0) {
    var arrayData = [["","","","","","","","","","","","","","","","","","","","","","","","",""]];
  } else {
    var rowNumber=findRow(idNumber);

    if(rowNumber == -1) {
      SpreadsheetApp.getUi().alert('Nincs ilyen betegszam!');
      return;
    }

    var range1=shData.getRange(rowNumber,1,1,shData.getLastColumn());
    var arrayData=range1.getValues();
  }

  var arrayDataT = new Array(new Array);
  var arr = new Array(new Array);
  var arrT = new Array(new Array);

  arrayDataT = transpose(arrayData);

  arrT = arrayDataT.slice(1,6);
  arr = transpose(arrT);
  shEdit.getRange(5,1,1,5).setValues(arr);

  shEdit.getRange(2,4).setValue(arrayData[0][6]);

  arrT = arrayDataT.slice(7,11);
  shEdit.getRange(7,2,4).setValues(arrT);

  arrT = arrayDataT.slice(7,11);
  shEdit.getRange(7,2,4).setValues(arrT);

  shEdit.getRange(7,3).setValue(arrayData[0][11]);

  arrT = arrayDataT.slice(12,16);
  shEdit.getRange(7,4,4).setValues(arrT);

  arrT = arrayDataT.slice(16,20);
  shEdit.getRange(12,2,4).setValues(arrT);

  shEdit.getRange(12,3).setValue(arrayData[0][20]);

  arrT = arrayDataT.slice(21,25);
  shEdit.getRange(12,4,4).setValues(arrT);
}


//trasnspone a 2D array
 function transpose(a)
{
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}


//save the cells to the database, checks and writes out if the editor is sure or unsure
function saveData() {
  var app = SpreadsheetApp;
  var shData = app.getActiveSpreadsheet().getSheets()[0]; 
  var shEdit = app.getActiveSpreadsheet().getActiveSheet();

  var idNumber = shEdit.getRange(1,2).getValue();
  var row = findRow(idNumber);
  if(row == -1) {
  SpreadsheetApp.getUi().alert('Nincs ilyen betegszam!');
  return;
  }

  var arr = new Array;
  var arrT = new Array(new Array());
  var arrayData = new Array(new Array());
  var tempArray = new Array(new Array());

  arrT = shEdit.getRange(7,2,4).getValues();
  arr = transpose(arrT);
  arrayData.push(arr);

  arrT = shEdit.getRange(7,3).getValue();
  tempArray[0][0] = arrT;
  arrayData.push(tempArray);

  arrT = shEdit.getRange(7,4,4).getValues();
  arr = transpose(arrT);
  arrayData.push(arr);

  arrT = shEdit.getRange(12,2,4).getValues();
  arr = transpose(arrT);
  arrayData.push(arr);

  arrT = shEdit.getRange(12,3).getValue();
  tempArray[0][0] = arrT;
  arrayData.push(tempArray);

  arrT = shEdit.getRange(12,4,4).getValues();
  arr = transpose(arrT);
  arrayData.push(arr);

  tempArray = new Array(new Array);

  var count = 0;
  for(var i=1; i<arrayData.length; i++){
    for(var j=0; j<(arrayData[i][0].length); j++){
      tempArray[0][count]=arrayData[i][0][j];
      count++;
      }
  }

  shData.getRange(row,8,1,18).setValues(tempArray);


  var sure = shEdit.getRange(20,6).getValue();

  if(sure) {
  shData.getRange(row, 7).setValue("KÉSZ");
  shEdit.getRange(2,4).setValue("KÉSZ");
  } else {
  shData.getRange(row, 7).setValue("BIZONYTALAN");
  shEdit.getRange(2,4).setValue("BIZONYTALAN");
  }

}


//returns the row number of the id value in the database
function findRow(idNumber) {
  var app = SpreadsheetApp;
  var shData = app.getActiveSpreadsheet().getSheets()[0]; 
  var matchArray = shData.getRange("A:A").getValues();

  for(var count=0; count<matchArray.length; count++){
      if(matchArray[count][0]==idNumber) return count+1;
  }
  return -1;
}


//runs if the id cell is modified
function onEdit(e) { 
  var range = e.range;
  var columnOfCellEdited = range.getColumn();
  var rowOfCellEdited = range.getRow();

  if (columnOfCellEdited === 2 && rowOfCellEdited === 1) {
    copySelectedRow();
    collision();
  }
};


//increment the value of id by one
function incrementByOne() { 
  var app = SpreadsheetApp;
  var targetSheet = app.getActiveSpreadsheet().getActiveSheet();
  var tempNumber = targetSheet.getRange(1,2).getValue();
  targetSheet.getRange(1, 2).setValue(tempNumber+1);
  copySelectedRow();
  collision();
}


//decrement the value of id by one
function decrementByOne() { 
  var app = SpreadsheetApp;
  var targetSheet = app.getActiveSpreadsheet().getActiveSheet();
  var tempNumber = targetSheet.getRange(1,2).getValue();
  targetSheet.getRange(1, 2).setValue(tempNumber-1);
  copySelectedRow();
  collision();
}

//writes out if more editors are editing the same line
function collision(){ 
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var allSheets=ss.getSheets();

  var idArray = new Array();
  var temp;

  for(var i=1; i<allSheets.length; i++){
    temp = allSheets[i].getRange(1,2).getValue();
    idArray.push(temp);
  }

  var collisionArray = new Array();

  for(var i=0; i<idArray.length; i++){
    for(var j=i+1; j<idArray.length; j++){
      if(idArray[i] == idArray[j]){
        collisionArray.push(i);  
        collisionArray.push(j); 
      }
    }
  }

  for(var i=1; i<allSheets.length; i++){
    allSheets[i].getRange(1,3).setValue("");
  }

  for(var i=0; i<collisionArray.length; i++){
    allSheets[collisionArray[i]+1].getRange(1,3).setValue("SZERKESZTÉS ALATT");
  }
 }

因此,如果我点击与incrementByOne相关联的图形,则会出现错误,但如果我只是更改单元格,则onEdit()可以轻松调用相同的函数。

(对不起,长代码,我不知道哪个部分可能很重要。如果你告诉我,我会缩短它。)

1 个答案:

答案 0 :(得分:0)

解决方案:

如果我与链接共享代码,匿名编辑器不能使用每个脚本,因为身份验证问题(不要问为什么它不是onEdit()的问题)。此外,如果编辑器登录到他/她的Gmail帐户并接受所有内容,则脚本将变为可运行(但可能比所有者帐户慢一点。)