我寫了一個 onEdit 腳本,它從一個電子表格中獲取值并將它們設定到另一個電子表格中。我在其他 onOpen 腳本上使用 SpreadsheetApp.openById 沒有任何問題。但僅對于這個特定的新腳本,它告訴我我沒有使用 openById 的權限。我讀了其他的答案,說要更改我所做的 oauthScopes,但它仍然說我沒有許可。
{
"oauthScopes": [
"https://www.googleapis.com/auth/spreadsheets.readonly",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/spreadsheets"
],
"timeZone": "America/Argentina/Buenos_Aires",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
}
這是我寫的腳本。
function onEdit(e){
//reemplazar targetID por ID de hoja real
var targetID = '14VgIUDG7m0-Z9SGCec5GBfaivrA_8bakUTu2qfWw_Ho';
var ss = SpreadsheetApp.openById(targetID);
var s = ss.getSheetByName('Cortes');
const row = e.range.getRow();
const col = e.range.getColumn();
const SHEET_NAME = 'Pendientes';
const DATE_COLUMN = 4;
const FIXEDROW = 2;
const ESTADO_COLUMN = 5;
const ESTADO_COLUMN_2 = 25;
const RESP_COLUMN = 3;
const TARGET_ROW_COLUMN = 26;
const ESTADO = e.source.getActiveSheet().getRange(row, ESTADO_COLUMN).getValue();
const ESTADO_2 = e.source.getActiveSheet().getRange(row, ESTADO_COLUMN_2).getValue();
const RESP = e.source.getActiveSheet().getRange(row, RESP_COLUMN).getValue();
Logger.log(row);
Logger.log(TARGET_ROW_COLUMN);
const TARGET_ROW = e.source.getActiveSheet().getRange(row, TARGET_ROW_COLUMN).getValue();
const TARGET_RESP_COLUMN = 3;
const TARGET_ESTADO_COLUMN = 5;
const TARGET_TIME_COLUMN = 4;
var cellRange = s.getRange(TARGET_ROW, targetColumn);
//set estado y resp
if (e.source.getActiveSheet().getName() == SHEET_NAME && row > FIXEDROW){
//si modifica el estado
if (ESTADO !== '' && ESTADO !== ESTADO_2) {
var targetColumn = TARGET_ESTADO_COLUMN;
var targetValue = ESTADO;
}
//si modifica el responsable
else if (RESP !== ''){
var targetColumn = TARGET_RESP_COLUMN;
var targetValue = RESP;
}
cellRange.setValue(targetValue);
}
//set timestamp if estado=preparado o estado=entregado y resp<>"" y timestamp=""
//actualizar si cambian los nombres de los pasos de preparación
if ((ESTADO == 'Preparado' || ESTADO == 'Entregado') && RESP !== ''){
var targetColumn = TARGET_TIME_COLUMN;
var targetValue = new Date();
cellRange.setValue(targetValue);
}
}
這是發布腳本的電子表格,我從中獲取值:
uj5u.com熱心網友回復:
我相信您可以使用可安裝的 onEdit 觸發器來做到這一點
舉個例子,我用這段代碼將資料從一個電子表格復制到另一個電子表格
function onMyEdit(e) {
e.source.toast("Entry");
const sh = e.range.getSheet();
const vs = sh.getDataRange().getValues();
const tss = SpreadsheetApp.openById(gobj.globals.testsourceid);//this is just a global object that holds one of my spreadsheet ids
const tsh = tss.getSheetByName("Sheet5");
tsh.getRange(1,1,vs.length,vs[0].length).setValues(vs);
}
我剛剛編輯了源端的一個單元格,資料立即傳輸。所以只需創建一個可安裝的觸發器,但不要將其命名為 onEdit()。它仍然會像 onEdit 一樣作業,甚至具有相同的事件物件。
這是事件物件的副本:
{"authMode":"FULL","range":{"columnEnd":13,"columnStart":13,"rowEnd":23,"rowStart":23},"source":{},"triggerUid":"","user":{"email":"","nickname":""},"value":"dd"}
uj5u.com熱心網友回復:
我最終通過解決 onEdit 限制解決了這個問題。我沒有在 onEdit 上直接使用 SpreadsheetApp.openById,而是創建了一個自定義函式,然后在 onEdit 上呼叫它。
function onEdit(e){
const row = e.range.getRow();
const col = e.range.getColumn();
const SHEET_NAME = 'Pendientes';
const DATE_COLUMN = 4;
const FIXEDROW = 2;
const ESTADO_COLUMN = 5;
const ESTADO_COLUMN_2 = 25;
const RESP_COLUMN = 3;
const TARGET_ROW_COLUMN = 26;
const ESTADO = e.source.getActiveSheet().getRange(row, ESTADO_COLUMN).getValue();
const ESTADO_2 = e.source.getActiveSheet().getRange(row, ESTADO_COLUMN_2).getValue();
const RESP = e.source.getActiveSheet().getRange(row, RESP_COLUMN).getValue();
Logger.log(row);
Logger.log(TARGET_ROW_COLUMN);
const TARGET_ROW = e.source.getActiveSheet().getRange(row, TARGET_ROW_COLUMN).getValue();
const TARGET_RESP_COLUMN = 3;
const TARGET_ESTADO_COLUMN = 5;
const TARGET_TIME_COLUMN = 4;
//set estado y resp
if (e.source.getActiveSheet().getName() == SHEET_NAME && row > FIXEDROW){
//si modifica el estado
if (ESTADO !== '' && ESTADO !== ESTADO_2) {
var targetColumn = TARGET_ESTADO_COLUMN;
var targetValue = ESTADO;
}
//si modifica el responsable
else if (RESP !== ''){
var targetColumn = TARGET_RESP_COLUMN;
var targetValue = RESP;
}
exportValue(TARGET_ROW, targetColumn,targetValue)
}
//set timestamp if estado=preparado o estado=entregado y resp<>"" y timestamp=""
//actualizar si cambian los nombres de los pasos de preparación
if ((ESTADO == 'Preparado' || ESTADO == 'Entregado') && RESP !== ''){
var targetColumn = TARGET_TIME_COLUMN;
var targetValue = new Date();
exportValue(TARGET_ROW, targetColumn,targetValue)
}
}
function exportValue(row,column,value) {
//reemplazar targetID por ID de hoja real
var targetID = '14VgIUDG7m0-Z9SGCec5GBfaivrA_8bakUTu2qfWw_Ho';
var ss = SpreadsheetApp.openById(targetID);
var s = ss.getSheetByName('Cortes');
var target = s.getRange(row, column);
target.setValue(value);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/534777.html
標籤:谷歌应用脚本谷歌表格