![](/img/trans.png)
[英]Automatically protect a cell / range after inputting data in Google Sheets
[英]Shift Cell Range in Google Sheets
我正在嘗試獲取一系列單元格並將它們全部向右移動一個單元格。 我希望這每周自動發生一次。 我知道在腳本編輯器中我可以為它創建一個每周安排的觸發器,但我不確定如何對其進行編碼。
如果有人可以幫助提供一個代碼,允許我指示哪個 SHEET 和 CELL RANGE 向右移動一個單元格,我將不勝感激。
基本上,我想要完成的是跟蹤數周的數據。 每周都會更新工作表,我希望舊數據向右移動一個,基本上表明數據已經過去一周了。
此外,我只是試圖將數據保留 6 周左右,因此數據不會永遠持續下去。
舉個例子:A 列 = 當前一周(手動更新)。 BF 列 = 前幾周(1-5 周前)。
每周一次,AE 列中的數據應右移 1 以保留數據。 輪班后,A 列中的數據被手動更新以表示當前一周。 這將導致顯示當前周和另外 5 周的數據……總共 6 周的數據。
如果可能的話,如果有一種方法可以在排除標題行而不是范圍的同時移動列,我會很感興趣。
可以嘗試這樣的事情嗎?
function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheets()[0]; // This inserts 1 columns before the first column sheet.insertColumnsBefore(1, 1); // labels the weeks static ss.getRange('A1').setFontWeight("bold").setValue("Week1").setBackground("#BBBBBB"); ss.getRange('B1').setFontWeight("bold").setValue("Week2").setBackground("#BBBBBB"); ss.getRange('C1').setFontWeight("bold").setValue("Week3").setBackground("#BBBBBB"); ss.getRange('D1').setFontWeight("bold").setValue("Week4").setBackground("#BBBBBB"); ss.getRange('E1').setFontWeight("bold").setValue("Week5").setBackground("#BBBBBB"); ss.getRange('F1').setFontWeight("bold").setValue("Week6").setBackground("#BBBBBB"); }
function rangeJog(hoffset,voffset,moveselection) { var hoffset = (typeof(hoffset)?== 'undefined'): hoffset; 1? var voffset = (typeof(voffset):== 'undefined'); voffset? 0: var moveselection = (typeof(moveselection);= 'undefined'). moveselection; true. var src = SpreadsheetApp;getActiveRange(). var srcA1 = src;getA1Notation(). var row = src;getRow() + voffset. var col = src.getColumn() + hoffset; var rows = src.getLastRow() - src.getRow() + 1; var cols = src,getLastColumn() - src.getColumn() +1. if((row<1) || (col<1)) { //dispStatus('No More Room to Move'.'<p>Either the first row or the first column or both will be less than one. <input type="button" value="exit" onClick="google;script,host,close();" /></p>'. 400. 200). SpreadsheetApp;getUi().alert('No more room to move.'). } else { var des = SpreadsheetApp,getActiveSheet().getRange(src,getRow() + voffset. src.getColumn() + hoffset, src.getLastRow() - src.getRow() + 1; src.getLastColumn() - src;getColumn() +1). var srcA = src;getValues(). src;clearContent(). des.setValues(srcA); if(moveselection) { SpreadsheetApp;getActiveSheet().setActiveSelection(des); } } var end = "is near"; }
它現在適用於選定的范圍,但任何范圍都可以工作,因為所有計算都是相對於 src 范圍的。 如果 moveselection 為真,我還修改了它以移動選擇。
但是在左側插入新列的想法可能是一種更簡單的方法。 盡管我沒有看到任何插入單元格命令,因此插入一列也會移動您的標題。
根據您上次的評論,我決定給您另一種解決方案。 該解決方案會將任何工作表中的任何范圍的數據復制或剪切並粘貼到具有相同尺寸的任何其他范圍。 范圍可以在同一頁面或不同頁面上,並且范圍可以重疊。 此外,一旦您復制范圍,文檔將記住源范圍和目標范圍,以便您可以再次復制或剪切和粘貼它們,而無需設置范圍。 如果您想更改范圍,只需運行例程,它會讓您選擇清除范圍,然后您可以再次運行它,它會記住新的范圍。 菜單上的復制和剪切選項運行例程。 顯示屬性選項顯示您當前的設置。 清除范圍只會刪除 DocumentProperties 中的所有內容。
但是復制和剪切選項將為您提供所有相同的信息。
function onOpen()
{
var ui = SpreadsheetApp.getUi();
ui.createMenu('My Tools')
.addItem('Copy or Cut', 'copyFromToSetupUi')
.addItem('Display Properties','dispProperties')
.addItem('Clear Ranges','clearCopyProperties')
.addToUi();
}
function dispProperties()
{
var copyProperties = PropertiesService.getDocumentProperties();
var srcShtNameStr = copyProperties.getProperty('SourceSheetName');
var srcShtRangeStr = copyProperties.getProperty('SourceSheetRange');
var desShtNameStr = copyProperties.getProperty('DestinationSheetName');
var desShtRangeStr = copyProperties.getProperty('DestinationSheetRange');
var title = 'Copy From To Sheets Properties';
var msg = 'Source Sheet Name = ' + srcShtNameStr + '<br />';
msg += 'Source Sheet Range = ' + srcShtRangeStr + '<br />';
msg += 'Destination Sheet Range = ' + desShtNameStr + '<br />';
msg += 'Destination Sheet Range = ' + desShtRangeStr + '<br />';
msg += '<input type="button" value="Exit" onClick="google.script.host.close();" />';
dispStatus(title,msg);
}
function copyFromToSheets()
{
var copyProperties = PropertiesService.getDocumentProperties();
var srcRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(copyProperties.getProperty('SourceSheetName')).getRange(copyProperties.getProperty('SourceSheetRange'));
var srcA = srcRange.getValues();
srcRange.setBackground('#ffffff');
var desRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(copyProperties.getProperty('DestinationSheetName')).getRange(copyProperties.getProperty('DestinationSheetRange'));
desRange.setValues(srcA);
desRange.setBackground('#ffffff');
}
function cutnpasteFromToSheets()
{
var copyProperties = PropertiesService.getDocumentProperties();
var srcRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(copyProperties.getProperty('SourceSheetName')).getRange(copyProperties.getProperty('SourceSheetRange'));
var srcA = srcRange.getValues();
srcRange.clearContent();
srcRange.setBackground('#ffffff');
var desRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(copyProperties.getProperty('DestinationSheetName')).getRange(copyProperties.getProperty('DestinationSheetRange'));
desRange.setValues(srcA);
desRange.setBackground('#ffffff');
}
function setCopySource()
{
var srcShtName = SpreadsheetApp.getActiveSheet().getName();
var srcShtRange = SpreadsheetApp.getActiveRange();
var copyProperties = PropertiesService.getDocumentProperties();
copyProperties.setProperty('SourceSheetRange', srcShtRange.getA1Notation());
copyProperties.setProperty('SourceSheetName', srcShtName);
srcShtRange.setBackground('#d9caa9');
}
function setCopyDestination()
{
var desShtName = SpreadsheetApp.getActiveSheet().getName();
var desShtRange = SpreadsheetApp.getActiveRange();
var copyProperties = PropertiesService.getDocumentProperties();
copyProperties.setProperty('DestinationSheetRange',desShtRange.getA1Notation());
copyProperties.setProperty('DestinationSheetName', desShtName);
desShtRange.setBackground('#c4df87');
}
function clearCopyProperties()
{
var copyProperties = PropertiesService.getDocumentProperties();
var srcShtNameStr = copyProperties.getProperty('SourceSheetName');
var srcShtRangeStr = copyProperties.getProperty('SourceSheetRange');
var desShtNameStr = copyProperties.getProperty('DestinationSheetName');
var desShtRangeStr = copyProperties.getProperty('DestinationSheetRange');
if(srcShtNameStr && srcShtRangeStr)
{
var srcShtRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(srcShtNameStr).getRange(srcShtRangeStr);
srcShtRange.setBackground('#ffffff');
}
else
{
SpreadsheetApp.getUi().alert('At least one of the Source String Properties is undefined in clearCopyProperties so background color cannot be reset.');
}
if(desShtNameStr && desShtRangeStr)
{
var desShtRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(desShtNameStr).getRange(desShtRangeStr);
desShtRange.setBackground('#ffffff');
}
else
{
SpreadsheetApp.getUi().alert('At least one of the Destination String Properties is undefined in clearCopyProperties so background color cannot be reset.');
}
copyProperties.setProperty('SourceSheetName', '');
copyProperties.setProperty('SourceSheetRange', '');
copyProperties.setProperty('DestinationSheetName', '');
copyProperties.setProperty('DestinationSheetRange', '');
}
function copyFromToSetupUi()
{
var copyProperties = PropertiesService.getDocumentProperties();
var srcShtNameStr = copyProperties.getProperty('SourceSheetName');
var srcShtRangeStr = copyProperties.getProperty('SourceSheetRange');
var desShtNameStr = copyProperties.getProperty('DestinationSheetName');
var desShtRangeStr = copyProperties.getProperty('DestinationSheetRange');
var title='No Title';
var msg = 'No Text';
if(!srcShtNameStr || !srcShtRangeStr ) //if !src
{
title = 'Select Source Range';
msg = '<p>Please select input range from <strong>Source Sheet.</strong> and then press "Source Range Selected" button below.</p>\
<br /><input type="button" value="Source Range Selected" onclick="google.script.run.copyFromToSetupHelper(1);google.script.host.close();" />';
msg += '<script>console.log(\'flag1\');</script>';
dispStatus(title, msg);
}
if ((srcShtNameStr && srcShtRangeStr) && (!desShtNameStr || !desShtRangeStr)) //if src and !des
{
var srcShtRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(srcShtNameStr).getRange(srcShtRangeStr);
title = 'Select Destination Range';
msg = '<p>Please select a destination range which is ' + srcShtRange.getNumRows() + ' rows by ' + srcShtRange.getNumColumns() + ' columns.</p>';
msg += '<br /><input type="button" value="Destination Range Selected" onclick="google.script.run.copyFromToSetupHelper(2);google.script.host.close();" />';
msg += '<br />Input Range: ' + srcShtRangeStr + '<br /><input type="button" value="Clear Ranges and Start Over" onClick="google.script.run.clearCopyProperties();google.script.host.close(); />';
dispStatus(title, msg);
}
if((srcShtNameStr && srcShtRangeStr) && (desShtNameStr && desShtRangeStr))//if src and des
{
var srcShtRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(srcShtNameStr).getRange(srcShtRangeStr);
var desShtRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(desShtNameStr).getRange(desShtRangeStr);
if((desShtRange.getWidth()===srcShtRange.getWidth()) && (desShtRange.getHeight()===srcShtRange.getHeight()))
{
title= 'Displaying Source and Destination Ranges';
msg = '<br />Source Sheet/Range: ' + srcShtNameStr + '/' + srcShtRangeStr + '<br />Destination Sheet/Range: ' + desShtNameStr + '/' + desShtRangeStr + '<br />';
msg += '<br /><input type="button" value="Perform Copy" onclick="google.script.run.copyFromToSheets();google.script.host.close();" />';
msg += '<br /><input type="button" value="Perform Cut & Paste" onclick="google.script.run.cutnpasteFromToSheets();google.script.host.close();" />';
msg += '<br /><input type="button" value="Keep both Ranges Defined" onclick="google.script.host.close();" />';
msg += '<br /><input type="button" value="Clear Ranges and Start Over" onclick="google.script.run.clearCopyProperties();google.script.host.close();" />';
dispStatus(title,msg);
}
else
{
var srcShtRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(srcShtNameStr).getRange(srcShtRangeStr);
var desShtRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(desShtNameStr).getRange(desShtRangeStr);
var newdesShtRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(desShtNameStr).getRange(desShtRange.getRow(), desShtRange.getColumn(), srcShtRange.getNumRows(), srcShtRange.getNumColumns());
desShtRange.setBackground('white');
newdesShtRange.setBackground('#c4df87');
copyProperties.setProperty('DestinationSheetRange', newdesShtRange.getA1Notation());
title = 'Destination Range Adjusted';
msg = 'Source Range and Destination Range Dimension did not Match. So it was assumed that the upper left corner of the Destination Range is correct';
msg += 'and that the Sheet Selections were correct. The Destination Range was modified to have the same dimensions as the Source Range. ';
msg += '<br />Source Sheet/Range: ' + srcShtNameStr + '/' + srcShtRangeStr + '<br />Destination Sheet/Range: ' + desShtNameStr + '/' + newdesShtRange.getA1Notation() + '<br />';
msg += '<br /><input type="button" value="Perform Copy" onclick="google.script.run.copyFromToSheets();google.script.host.close();" />';
msg += '<br /><input type="button" value="Perform Cut & Paste" onclick="google.script.run.cutnpasteFromToSheets();google.script.host.close();" />';
msg += '<br /><input type="button" value="Keep both Ranges Defined" onclick="google.script.host.close();" />';
msg += '<br /><input type="button" value="Clear Ranges and Start Over" onclick="google.script.run.clearCopyProperties();;google.script.host.close(); />';
dispStatus(title,msg);
}
}
}
function copyFromToSetupHelper(mode)
{
var mode = (typeof(mode) !== 'undefined')? mode : 0;
switch(mode)
{
case 1:
setCopySource();
copyFromToSetupUi();
break;
case 2:
setCopyDestination();
copyFromToSetupUi();
break;
default:
clearCopyProperties();
}
}
// Display a modeless dialog box with custom HtmlService content.
function dispStatus(title,html,width,height)
{
var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
var width = typeof(width) !== 'undefined' ? width : 400;
var height = typeof(height) !== 'undefined' ? height : 300;
var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
var htmlOutput = HtmlService
.createHtmlOutput(html)
.setWidth(width)
.setHeight(height);
SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.