3

中小企業の毎日の在庫を含む Google ドキュメントのスプレッドシートがあります。スクリプトのコピーを作成し、終値株を始値株にコピーしてから、さまざまなフィールド (受け取った現金など) をゼロにするスクリプトを作成しました。

問題は、ユーザーが現在表示しているドキュメントを変更する方法がないように思われるため、スクリプトを実行してから、フォルダーに戻って新しい日のファイルを開いて編集する必要があることです。

コードは次のようになります。

/**
 * Setup the spreadsheet for a new day
 */
function newDay(date) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  /* Generate localtime version
   * Do this instead?
   * newSs.setSpreadsheetTimeZone('Australia/Adelaide'); */
  var calTimeZone = 'Australia/Adelaide';
  var timeStamp = Utilities.formatDate(date, calTimeZone, 'yyyy/M/d');

  var newName = Utilities.formatDate(date, calTimeZone, 'yyyyMMdd');

  /* Save new version and set ss to that new spreadsheet */
  var newSs = ss.copy(newName);
  Logger.log("Saved to " + newName + ", URL " + newSs.getUrl());
  var id = newSs.getId();

  /* Get file ID for the new spreadsheet */
  var file = DocsList.getFileById(id);

  /* Get handle for Java Drive folder */
  var folder = DocsList.getFolderById('xxxxxx');

  /* Remove new file from all its parents */
  Logger.log("parents - " + file.getParents());
  var parents = file.getParents();
  for (var i in parents) {
    file.removeFromFolder(parents[i]);
  }

  /* Add file into the Java Drive folder */
  file.addToFolder(folder);

  var dateRange = newSs.getRangeByName('date');
  dateRange.setValue(timeStamp);

  // Munge other ranges as needed

  Logger.log("Done");

  var app = UiApp.createApplication().setTitle('All done');
  var dialog = app.createDialogBox(false, true);
  var label = app.createLabel('The new file has been created named ' + newName + ' and is ready to edit. This file is unmodified, please close it and open the new one', true);
  dialog.add(label);
  dialog.show();
  ss.show(app);
};

/* Draw the date picker and setup hooks */
function drawUI() {
  var app = UiApp.createApplication().setTitle('Select date');
  var panel = app.createVerticalPanel();  
  var datePicker = app.createDatePicker();
  var submit = app.createButton('Submit');
  datePicker.setId('datePicker');
  var clickHandler = app.createServerHandler('handleSubmit');
  clickHandler.addCallbackElement(panel);
  submit.addClickHandler(clickHandler);
  panel.add(datePicker);
  panel.add(submit);
  app.add(panel);
  var d = Date();

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.show(app);

}

/* Run newDay in response to the user clicking submit */
function handleSubmit(e) {
  var app = UiApp.getActiveApplication();
  var date = e.parameter.datePicker;
  newDay(date);
  return app.close();
}

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the newDay() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "New Day",
    functionName : "drawUI"
  }];
  sheet.addMenu("Scripts", entries);

  //drawUI();
};
4

1 に答える 1

1

Darius さん、あなたの Google App Script が他の URL に移動する方法はありません。できることのほとんどは、セルにハイパーリンクを表示して、ユーザーがクリックできるようにすることです。それは他のタブで開きます。もちろん、そうするにはユーザーの操作が必要です。(HTML サービスの主題を持ち出したくありません。それは範囲外です。)

これらのスクリプトは Google サーバーで実行されます。スクリプトが Doc またはスプレッドシートを開くときは、そのデータにアクセスするために行いますが、ブラウザーに表示するためではありません。

「コンテナ バインド スクリプト」(ドキュメントまたはスプレッドシートから作成するスクリプト) のみが、メニューやパネルの追加など、ユーザー インターフェイスと穏やかに対話できます。

データを表示したい場合は、それを「range.setValues」するか、HTML サービスを使用してスタンドアロン スクリプトで Web ページを作成し、スプレッドシートから取得したデータを表示することができます。

于 2014-02-24T19:13:29.143 に答える